Leetcode 52 N-Queens II 回溯搜索

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

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

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

                                                                    

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

 这种搜索也可以参考DFS框架Leetcode 130 Surrounded Regions DFS

 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 };

 

posted @ 2016-01-24 22:42  Breeze0806  阅读(452)  评论(0编辑  收藏  举报