回溯算法 C++代码
class Solution {
public:
vector<vector<string>> res;
vector<vector<string>> solveNQueens(int n) {
vector<string> board(n,string(n,'.'));
backtrack(board, 0);
return res;
}
void backtrack(vector<string>& board, int row){
// 结束
if(row == board.size()){
res.push_back(board);
return;
}
int n = board[row].size();
for(int col = 0; col < n; col++){
//有冲突,不合法
if(!isVaild(board, row, col))
continue;
// 做出选择
board[row][col] = 'Q';
// 进入下一行决策
backtrack(board, row + 1);
// 撤销选择
board[row][col] = '.';
}
}
bool isVaild(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;
}
};
对于 vector 初始化
vector<string> board(n,string(n,'.'));
C++ 中 char 转 string 的方法,可以使用 string 的构造函数
string (size_t n, char c);
对于回溯函数 backtrack(), 下面这种写法是错误的
void backtrack(vector<string>& board, int row){
// !!!
int n = board[row].size();
if(row == n){
res.push_back(board);
return;
}
for(int col = 0; col < n; col++){
if(!isValid(board, row, col))
continue;
board[row][col] = 'Q';
backtrack(board, row + 1);
board[row][col] = '.';
}
}