N 皇后问题。典型的回溯解法。通过维持一个全局数组来记录当前尝试的皇后所在的列和两个对角线是否已经存在其他皇后。注意主对角线标识y-x可能为负,存取时需要加上n.
我们可以通过坐标(x,y)的值来表示对角线。x+y的值标识副对角线,y-x的值标识主对角线。
class Solution {
public:
void search(int cur,int n,vector<vector<int>>& vis,int &num ){
if(cur>=n)
{
num++;
return;
}
for(int i=0;i<n;i++){
if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n])
{
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
search(cur+1,n,vis,num);
vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
}
}
}
int totalNQueens(int n) {
vector<vector<int>> vis(3,vector<int>(2*n,0));
int num=0;
search(0,n,vis,num);
return num;
}
};