51. N 皇后

class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<bool> col(n, false);
vector<bool> main(2 * n - 1, false);
vector<bool> sub(2 * n - 1, false);
vector<vector<string>> result;
vector<int> path;
dfs(n, 0, col, main, sub, path, result);
return result;
}
void dfs(int n, int row, vector<bool>& col, vector<bool>& main, vector<bool>& sub,
vector<int>& path, vector<vector<string>>& result){
if(row == n){
vector<string> board = convert2board(path, n);
result.push_back(board);
return;
}
for(int j = 0; j < n; j++){
if(!col[j] && !main[(n-1) + (row - j)] && !sub[row + j]){
path.push_back(j);
col[j] = true;
main[(n-1) + (row - j)] = true;
sub[row + j] = true;
dfs(n, row + 1, col, main, sub, path, result);
sub[row + j] = false;
main[(n-1) + (row - j)] = false;
col[j] = false;
path.pop_back();
}
}
}
vector<string> convert2board(vector<int> path, int n){
vector<string> board;
for(int num : path){
string colStr(n, '.');
colStr.replace(num, 1, "Q");
board.push_back(colStr);
}
return board;
}
};