LeetCode: N-Queens II 解题报告

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 }
View Code

 

GITHUB:

https://github.com/yuzhangcmu/LeetCode_algorithm/blob/master/dfs/totalNQueens_1218_2014.java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值