class Solution {
private:
vector<vector<string>> result;
bool attack(vector<char>& path, int n, int x){
for(int i=0;i<n;i++){
if(path[i*n+x%n]=='Q'){
return false;
}
}
for(int i=x;i>=0;i=i-n-1){
if(path[i]=='Q'){
return false;
}
if((i/n-(i-n-1)/n)!=1) break;
}
for(int i=x;i>0;i=i-n+1){
if(path[i]=='Q'){
return false;
}
if((i-n+1)/n==i/n) break;
}
return true;
}
void bt(vector<char>& path, int n, int x){
if(x>=n*n){
string s;
s.resize(n);
vector<string>qp;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
s[j]=path[i*n+j];
}
qp.push_back(s);
}
result.push_back(qp);
return;
}
for(int i=0;i<n;i++){
if(attack(path,n,x+i)){
path[x+i]='Q';
bt(path,n,x+n);
path[x+i]='.';
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
vector<char> path(n*n,'.');
bt(path,n,0);
return result;
}
};
说起来其实不难,只要能正确判断一个位置是否能放皇后就能解决,笔者一开始没看清输出要求,以为是棋盘是拉直后整个输出,所以用一维容器来表示棋盘,用二维容器表示棋盘时判断是否能放皇后会更加容易。由于N皇后的性质,棋盘一行必须有且仅有一个皇后,所以回溯可按行分层,省去了在在判断是否能放皇后时对行进行检查的步骤。