题目描述
回溯法
这道题与第51题是一样的。51. N-Queens-优快云博客
class Solution {
int columns; //从低位到高位起算,第i位为0表示棋盘第i列可以放置皇后,第i位为1表示棋盘第i列不能放置皇后
//边长为n的棋盘分别有2n-1条正斜线和反斜线。
int diagnals1;//反斜线(从右上角到左下角)。第i位表示第i条反斜线能否放置皇后
int diagnals2;//正斜线(从左上角到右下角)。含义同上
int res = 0;
public:
int totalNQueens(int n) {
columns = 0;
diagnals1 = 0;
diagnals2 = 0;
backtrack(n,0);
return res;
}
void backtrack(int n,int row){
if(row==n)
{
res++;
return;
}
for(int col = 0;col <n;col++){
if(columns &(1<<col))
continue;
int diag1 = row+col;
if(diagnals1 &(1<<diag1))
continue;
int diag2 = row-col+(n-1);
if(diagnals2 &(1<<diag2))
continue;
columns |= (1<<col);
diagnals1 |= (1<<diag1);
diagnals2 |= (1<<diag2);
backtrack(n,row+1);
columns &= (~(1<<col));
diagnals1 &= (~(1<<diag1));
diagnals2 &= (~(1<<diag2));
}
}
};