LeetCode热题100 N 皇后

题目描述

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

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

示例 1:


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

示例 2:

输入 :n = 1
输出 :[["Q"]]

提示:

1 <= n <= 9

思路

1 进行dfs,每层代表选取的行数,层内只需要遍历列数。

2 每个位置需要判断列、主对角线、副对角线是否重复,行不需要判断,因为dfs将层隔开了。

3 主对角线和副对角线的表示可以用 x + y 和 y - x 表示,注意y - x可能是负数,所以需要进行偏正为y - x + n。

代码

cpp 复制代码
class Solution {
public:
    
    vector<vector<string>> solveNQueens(int n) {
        // 记录多个答案
        vector<vector<string>>ans;
        // 记录单个答案
        vector<string>res;
        // 记录每层的答案
        string s(n, '.');

        // 某一列是否被标记
        vector<bool> st_col(n, false); 
        // 主对角线是否被标记
        vector<bool> main_diag(n * 2, false);
        // 次对角线是否被标记
        vector<bool> sub_diag(n * 2, false);

        // 每层枚举一行的所有列
        dfs(0, n, st_col, main_diag, sub_diag, s, res, ans);

        return ans;
    }

    void dfs(int row, int n, vector<bool> &st_col, vector<bool> &main_diag, vector<bool> &sub_diag, string &s, vector<string>&res, vector<vector<string>> &ans)
    {
        if(res.size() == n)
        {
            ans.push_back(res);
            return;
        }

        // 每层枚举一行的所有列
        for(int col = 0; col < n; ++col)
        {
            // 没有列、主副对角线冲突
            if(st_col[col] == false && main_diag[row + col] == false && sub_diag[col - row + n] == false)
            {
                st_col[col] = true;
                main_diag[row + col] = true;
                sub_diag[col - row + n] = true;
                s[col] = 'Q';
                res.push_back(s);
                s[col] = '.'; // 提前复原, 下一层要用到
                dfs(row + 1, n, st_col, main_diag, sub_diag, s, res, ans);
                st_col[col] = false;
                main_diag[row + col] = false;
                sub_diag[col - row + n] = false;
                res.pop_back();
            }
        }
    }

};
相关推荐
阿Y加油吧18 小时前
回溯算法双杀:子集 + 电话号码的字母组合 | 经典模板题解析
算法·leetcode
wuweijianlove18 小时前
算法验证与性能测试的统一框架设计的技术3
算法
LabVIEW开发18 小时前
LabVIEW插值应用
算法·labview·labview知识·labview功能·labview程序
Tanecious.18 小时前
蓝桥杯备赛:Day7- U535982 C-小梦的AB交换
c语言·c++·蓝桥杯
yuanmazhiwu18 小时前
计算机毕业设计:Python智慧出行数据分析与模式识别系统 Django框架 可视化 数据分析 PyEcharts 交通 深度学习(建议收藏)✅
人工智能·python·算法·数据分析·django·flask·课程设计
沉鱼.4418 小时前
第十一届题目
算法
杜子不疼.18 小时前
AutoGen vs CrewAI vs LangGraph:2026年 Agent 框架怎么选?
c++·microsoft
C雨后彩虹18 小时前
箱子之字形摆放
java·数据结构·算法·华为·面试
小肝一下20 小时前
每日两道力扣,day5
数据结构·c++·算法·leetcode·职场和发展·hot100
jiang_changsheng21 小时前
亚马逊的2026年最新算法变革自然流量分发机制“文本匹配”到“多模态意图理解”的范式革命
大数据·算法·推荐算法