推荐在刷本题前最后先了解一下回溯思想,有了回溯思想刷本题是很容易的
参考题目思路
https://programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html#%E6%80%9D%E8%B7%AF
解决N皇后的问题
解题思路:一层for循环遍历横向坐标,在for循环的每一层中递归第二至第N行的坐标判断皇后插入位置是否合理,合理即插入皇后。到遍历最后一行插入完以后返回数据(不管存不存在都返回)
判断位置不合理的三种情况(false):
1.同一列有皇后
2.四十五度角有皇后
3.135度角有皇后
其余情况都为true
第一行的皇后不在判定false范围内
// 检查列
for (int i = 0; i < row; i++) {
if (chessboard[i][col] == 'Q') {
return false;
}
}
第一行皇后不在false条件内
// 检查 45度角是否有皇后
for (int i = row - 1, j = col - 1; i >=0 && j >= 0; i--, j--) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
第一行皇后不在false条件内
// 检查 135度角是否有皇后
for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
if (chessboard[i][j] == 'Q') {
return false;
}
代码
class Solution {
private:
vector<vector<string>>result;
void backtracking(int n,int row,vector<string>&chessboard) {
if (row == n) { // 验证合法就可以放入
result.push_back(chessboard);
return;
}
for (int col = 0; col < n; col++) {
if (isValid(row, col, chessboard, n)) {
chessboard[row][col] = 'Q';
backtracking(n, row + 1, chessboard); //递归
chessboard[row][col] = '.'; //回溯
}
}
}
bool isValid(int row ,int col,vector<string>&chessboard,int n) {
//检查列
for (int i = 0; i < row; i++) {
if (chessboard[i][col] == 'Q') {
return false;
}
}
//检查45度角是否有皇后
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
//检查135度角是否有皇后
for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
if (chessboard[i][j] == 'Q') {
return false;
}
}
return true;
}
public:
vector<vector<string>> solveNQueens(int n) {
result.clear();
vector<string>cheessboard(n, string(n, '.'));
backtracking(n, 0, cheessboard);
return result;
}
};