- 分析
这个问题的本质和全排列问题差不多,决策树的每一层表示棋盘上的每一行;每个节点可以做出的选择是,在该行的任意一行放置一个皇后。函数backtrack函数像在决策树上游走的指针,每个节点就表示在board[row][col]上放置皇后,通过isValid函数可以将不符合条件的情况剪枝。在前面的博客讲解了回溯算法的框架,其实回溯算法就是改改做选择的方式,排除不合法选择的方式而已,只要框架存于心,面对的就是小问题。 - 代码
class Solution {
public:
vector<vector<string>> vec;
vector<vector<string>> solveNQueens(int n) {
vector<string> board(n, string(n,'.'));
backtrack(board, 0);
return vec;
}
void backtrack(vector<string>& board, int row){
if(row == board.size()){
vec.push_back(board);
return;
}
int n = board[row].size();
for(int col = 0; col < n; col++){
if(!isValid(board, row, col)){
continue;
}
board[row][col] = 'Q';
backtrack(board, row + 1);
board[row][col] = '.';
}
}
bool isValid(vector<string>& board, int row, int col){
int n = board.size();
for(int i = 0; i < n; i++){
if(board[i][col] == 'Q'){
return false;
}
}
for(int i = row - 1, j = col + 1; i >=0 && j < n; i--, j++){
if(board[i][j] == 'Q'){
return false;
}
}
for(int i = row - 1, j = col - 1; i >=0 && j >=0; i--, j--){
if(board[i][j] == 'Q'){
return false;
}
}
return true;
}
};