class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
//初始化棋盘,都为空
string point(n,'.');
vector<string> sample(n,point);
vector<vector<string>> result;
//求解
solve(result,sample,0,n);
return result;
}
void solve(vector<vector<string>>& result,vector<string>& board, int n1,int n2){
if(n1==n2) {
result.push_back(board);
return;
}
else{
for(int i=0;i<n2;i++){
if(isValid(board,n1,i,n2)) {
board[n1][i]='Q';
solve(result,board,n1+1,n2);
board[n1][i]='.';//关键在这块,否则计算出的结果不全
}
}
}
}
private:
bool isValid(std::vector<std::string> &nQueens, int row, int col, int &n) {
//check if the column had a queen before.
for (int i = 0; i != row; ++i)
if (nQueens[i][col] == 'Q')
return false;
//check if the 45° diagonal had a queen before.
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j)
if (nQueens[i][j] == 'Q')
return false;
//check if the 135° diagonal had a queen before.
for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j)
if (nQueens[i][j] == 'Q')
return false;
return true;
}
};