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;
    }
};
posted @   北原春希  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示