
class Solution {
private:
vector<bool> col,diaLeft,diaRight;
vector<vector<string>> res;
void putQueen(int n, int index, vector<int> &row){
if(index==n){
res.push_back(generate(n,row));
return;
}
for(int i=0;i<n;++i){
if(!col[i] && !diaLeft[index+i] && !diaRight[index-i+n-1]){
row.push_back(i);
col[i]=true;
diaLeft[index+i]=true;
diaRight[index-i+n-1]=true;
putQueen(n,index+1,row);
col[i]=false;
diaLeft[index+i]=false;
diaRight[index-i+n-1]=false;
row.pop_back();
}
}
return;
}
vector<string> generate(int n,vector<int> &row){
assert(n==row.size());
vector<string> board(n,string(n,'.'));
for(int i=0;i<n;++i)
board[i][row[i]]='Q';
return board;
}
public:
vector<vector<string>> solveNQueens(int n) {
res.clear();
col.clear();
diaLeft.clear();
diaRight.clear();
col=vector<bool>(n,false);
diaLeft=vector<bool>(2*n-1,false);
diaRight=vector<bool>(2*n-1,false);
vector<int> row;
putQueen(n,0,row);
return res;
}
};