N-Queens II (LEVEL 4 难度级别,最高级5)
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
解答:
与第一题的解法是类似的,不同之处是,DFS的返回值是解的个数。我们每一次搜索本行8个位置时,
把8个位置的解都加在一起就行了。有的位置无解,它的返回值就是0咯。
另外注意BASE CASE:
当row == size时,也就是row越界了,这时意思是整个N-Queen都摆满了,我们这时应返回解为1.因为
你不需要任何动作,也就是唯一的解是保持原状。(虽然有点难以理解),同学可以退回到上一层来想
比如最后一行,你放置了一个皇后,它就是1个解,所以在那里dfs到下一层应该返回1.
1 public class Solution { 2 public int totalNQueens(int n) { 3 if (n == 0) { 4 return 0; 5 } 6 7 // Bug 1: forget to modify the parameters of the function. 8 return dfs(n, 0, new ArrayList<Integer>()); 9 } 10 11 public int dfs(int n, int row, ArrayList<Integer> path) { 12 if (row == n) { 13 // The base case: 当最后一行,皇后只有1种放法(就是不放) 14 return 1; 15 } 16 17 int num = 0; 18 19 // The queen can select any of the slot. 20 for (int i = 0; i < n; i++) { 21 if (!isValid(path, i)) { 22 continue; 23 } 24 path.add(i); 25 26 // All the solutions is all the possiablities are add up. 27 num += dfs(n, row + 1, path); 28 path.remove(path.size() - 1); 29 } 30 31 return num; 32 } 33 34 public boolean isValid(ArrayList<Integer> path, int col) { 35 int size = path.size(); 36 for (int i = 0; i < size; i++) { 37 // The same column with any of the current queen. 38 if (col == path.get(i)) { 39 return false; 40 } 41 42 // diagonally lines. 43 // Bug 2: forget to add a ')' 44 if (size - i == Math.abs(col - path.get(i))) { 45 return false; 46 } 47 } 48 49 return true; 50 } 51 }
GITHUB:
https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/dfs/totalNQueens_1218_2014.java