Leetcode 52 N-Queens II 回溯搜索

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 52 N-Queens II 回溯搜索相关的知识,希望对你有一定的参考价值。

对于N-Queens的每种情况,回答出每种情况的N-Queens的排列数。

l,r和c是每种类型的格子是否有棋子。

l判断的是这样的对角线的格子                   r判断的是这样的对角线的格子              c   判断的是这样的竖线格子

      技术分享                                 技术分享                            技术分享 

 枚举每行放一颗棋子,判断是否与前面冲突,如果不冲突一直到底就让答案+1 

 1 class Solution {
 2 public:
 3     std::vector<bool> l,r,c;
 4     int ans;
 5     int totalNQueens(int n) {
 6         l.resize(2 * n + 1, false);
 7         r.resize(2 * n + 1, false);
 8         c.resize(    n    , false);
 9         ans = 0;
10         N_Queens(0 , n);
11         l.clear();
12         r.clear();
13         c.clear();
14         return ans;
15     }
16     void N_Queens(int now, int n){//计算N_Queens的可能数
17         if (now == n) {//递归到底
18             ans++;
19             return;
20         }
21         else{
22             for (int i = 0; i < n; ++i){
23                 if (is_legal(now, i, n)){//与之前不冲突在这上面放上棋子
24                     init(now, i, n, true);
25                     N_Queens(now + 1, n);
26                     init(now, i, n, false);
27                 }
28             }
29         }
30     }
31     bool is_legal(int x, int y, int n){//判断是否与前面冲突
32         return !c[y] && !l[x - y + n] && !r[x + y];
33     }
34     void init(int x, int y, int n, bool b){//l,r和c的值为b
35         c[y] = l[x - y + n] = r[x + y] = b;
36     }
37 };

 

以上是关于Leetcode 52 N-Queens II 回溯搜索的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode52 N-Queens II

LeetCode52 N-Queens II

LeetCode 52.N-Queens II

52.N-Queens II

[leetcode]N-Queens II

52. N-Queens II