2016-01-15 3 views
0
public class Solution { 

Set<Integer> column = new HashSet<Integer>(); 
Set<Integer> diag1 = new HashSet<Integer>(); 
Set<Integer> diag2 = new HashSet<Integer>(); 

public List<List<String>> solveNQueens(int n) { 
    ArrayList<List<String>> result = new ArrayList<List<String>>(); 
    ArrayList<String> list = new ArrayList<String>(); 
    dfs(result, list, 0, n); 
    return result; 
} 

private void dfs(ArrayList<List<String>> result, ArrayList<String> list, 
     int row, int n) { 
    if (row == n) { 
     result.add(new ArrayList<String>(list)); 
     // Why I have to "result.add(new ArrayList<String>(list))"? 
     // Why can't I just "result.add(list)"? 

     return; 
    } 

    for (int j = 0; j < n; j++) { 
     if (column.contains(j) || diag1.contains(row + j) 
       || diag2.contains(row - j))// check if there are other 
              // queens in the same column, 
              // diagonal1 or diagonal2 
      continue; 


     char[] rowChar = new char[n]; 
     Arrays.fill(rowChar, '.'); 
     rowChar[j] = 'Q'; 
     String str = new String(rowChar); 

     list.add(str); 
     column.add(j); 
     diag1.add(row + j); 
     diag2.add(row - j); 

     dfs(result, list, row + 1, n); 

     // remove the queen and the constraints 
     list.remove(list.size() - 1); 
     column.remove(j); 
     diag1.remove(row + j); 
     diag2.remove(row - j); 
    } 

} 

Это проблема N-Queens в Leetcode. Я нашел решение проблемы, но у меня есть вопрос, который я прокомментировал в коде. Почему я должен «result.add (новый ArrayList (список))»? Почему я не могу просто «result.add (list)»? С тех пор, как я использую «result.add (list)», результат неверен. Что с этим не так?Некоторая путаница в решении Leetcode NQueen

ответ

0

У меня есть. Поскольку result.add (list) только добавляет ссылку списка в результат. Когда содержимое списка изменится, добавленные вещи в результате также будут изменены. Поэтому result.add (новый ArrayList (список)).