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