Leetcode第51题(N皇后)

简介: 这篇文章介绍了解决LeetCode第51题N皇后问题的C++深度优先搜索(DFS)算法实现,包括详细的代码和解题思路。

题目描述:

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例 1:输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:输入:n = 1   输出:[["Q"]]

要使题目描述成立, 只需要DFS遍历每一行中的每一列即可, 如果该位置的行(col), 主对角线(dg), 副对角线(udg)均不存在皇后, 那么此位置就可以放置皇后。然后使用截距(b)的思想保存每一条对角线的状态(是否有皇后)。副对角线的截距为( y - x + n)是因为需要将截距转换为正数。

class Solution {
    //定义结果变量
    vector<vector<string>> ans;
    //定义存储 列, 主对角线, 副对角线 是否有皇后的变量
    vector<bool> col, dg, udg;
    //定义 子结果变量(结果的一行)
    vector<string> combine;
public:
    vector<vector<string>> solveNQueens(int n) {
        //初始化变量 n行
        col = vector<bool>(n);
        //2 * n 个对角线
        dg = udg = vector<bool>(2 * n);
        //将一行初始化为 "...."
        combine = vector<string>(n,string(n,'.'));
        //dfs深搜
        dfs(n, 0);
        return ans;
    }
    //dfs函数
    void dfs(int n, int x) {
        //走到最后一行, 将结果添加至ans
        if(x == n) {
            ans.push_back(combine);
            return;
        }
        //遍历列
        for(int y = 0; y < n; y++){
            //列  主对角线 副对角线有皇后(跳过本列)
            if(col[y] || dg[x + y] || udg[y - x + n]) continue;
            //添加符合条件的该行的皇后
            combine[x][y] = 'Q';
            col[y] = dg[x + y] = udg[y - x + n] = true;
            //dfs下一行
            dfs(n, x + 1);
            //搜索结束回退状态
            combine[x][y] = '.';
            col[y] = dg[x + y] = udg[y - x + n] = false;
        }
    }
};
相关文章
|
6月前
|
机器学习/深度学习 算法
leetcode51N皇后刷题打卡
leetcode51N皇后刷题打卡
47 0
|
6月前
|
Java
leetcode-198:打家劫舍
leetcode-198:打家劫舍
41 0
leetcode-198:打家劫舍
|
6月前
|
机器学习/深度学习
leetcode-52:N皇后 II
leetcode-52:N皇后 II
26 0
|
6月前
|
Java
leetcode-337:打家劫舍 III
leetcode-337:打家劫舍 III
45 0
|
6月前
|
Java
leetcode-213:打家劫舍 II
leetcode-213:打家劫舍 II
38 0
|
6月前
|
Java C++ Python
leetcode-59:螺旋矩阵 II
leetcode-59:螺旋矩阵 II
33 0
|
机器学习/深度学习 算法 安全
LeetCode - #52 N皇后 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #52 N皇后 II
|
算法 安全 Swift
LeetCode - #54 螺旋矩阵
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #54 螺旋矩阵
下一篇
无影云桌面