51. N 皇后
✅做题思路or感想
(二刷直接初见过,在用时和内存消耗上远强于一刷,我真的成长了)
经典八皇后问题,回溯法理所应当
八皇后的要求:一个皇后的上下左右,以及斜线上不能有其他皇后
故这里的思路就是判断当前位置是否符合八皇后的要求,符合,则回溯递归,不符合,则continue
递归三部曲
递归参数
- 除了地图和地图大小要传入外,这里还需要用
row
来代表现在递归进行到的哪一行了,这里的妙处是这样做可以直接排除了会有皇后在同一行的可能
递归中止条件
- 当
row
的值为地图大小n
时就停止递归,这里注意不是row == n - 1
就停了,这样的话会不能处理最后一行!!!所以要等最后一行处理完后再停止递归
递归单层逻辑
- 判断当前位置是否符合条件,若符合,则去下一行接着递归,否则
continue
class Solution {
public:
vector<vector<string>>result;
bool isGood(vector<string>& map, int n, int row, int col) {
//判断在同一列上是否有其他皇后
//注意这里的循环中止条件是i < row,而不能是i <= row,这样的话就包括自己了!会始终return false!
for (int i = 0; i < row; i++) {
if (map[i][col] == 'Q')return false;
}
//判断在左斜线方向上是否有其他皇后
//注意这里是从当前皇后的位置开始向左斜线方向遍历,而不是从左斜线方向到当前皇后遍历,因为不知道斜上方会在哪里结束!!!
//这里的处理就算得上是八皇后问题的难点了!!!
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
if (map[i][j] == 'Q')return false;
}
//判断在右斜线方向删是否有其他皇后
//同理如上,注意这里和上面的区别!!!!
for (int i = row - 1, j = col + 1; i >= 0 && j >= 0; i--, j++) {
if (map[i][j] == 'Q')return false;
}
return true;
}
void dfs(vector<string>& map, int n, int row) {
//注意不是 row == n - 1
if (row == n) {
result.push_back(map);
return;
}
for (int col = 0; col < n; col++) {
if (isGood(map, n, row, col)) {
map[row][col] = 'Q';
dfs(map, n, row + 1);
map[row][col] = '.'; //回溯
}
}
}
vector<vector<string>> solveNQueens(int n) {
string str;
//这里是把地图初始化为全是点,这样子做比string(n, '.')速度更快一点
for (int i = 0; i < n; i++) {
str = str + ".";
}
vector<string> map(n, str);
dfs(map, n, 0);
return result;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端