LeetCode 热题 100_N 皇后 (62_51_困难_C++)(递归(回溯))
LeetCode 热题 100_N 皇后(62_51)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(递归(回溯)):
- 代码实现
- 代码实现(思路一(递归(回溯))):
- 以思路一为例进行调试
题目描述:
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
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、解决此问题的思路是比较明确的。在第一行选取一个位置放置皇后,再在第二行选取一个位置放置一个皇后(放置皇后时判断是否可以放置),以此类推直至最后一行。因行数和列数不确定(不确定的多重循环),从而首先考虑回溯的解法。
递归树如下:

判断此位置是否可以放置皇后,可以挨个判断当前位置的之前行、列和同一斜线上是否有皇后。(还可以使用哈希集合来分别存储不可放置的行、列和同一斜线)
2、复杂度分析:
① 时间复杂度:O(N!),其中N是皇后数量。
② 空间复杂度:O(N),其中N是皇后数量。空间复杂度主要取决于递归调用层数、记录每行放置的皇后的列下标的数组,递归调用层数不会超过N,数组的长度为N。
代码实现
代码实现(思路一(递归(回溯))):
class Solution1 {
private:// 用于存储所有解法的答案vector<vector<string>> ans;// 回溯函数,用于寻找解决问题的所有方法void backtrack(int n, int row, vector<string> &board) {// 递归出口,当所有行都填满时,表示找到一个解if (row == n) {ans.emplace_back(board); // 将当前的棋盘布局加入答案中return;}// 遍历当前行的每一列,尝试在每一列放置皇后for (int col = 0; col < n; col++) {// 检查当前位置是否安全,安全则放置皇后if (isValid(row, col, n, board)) {board[row][col] = 'Q'; // 放置皇后backtrack(n, row + 1, board); // 递归处理下一行board[row][col] = '.'; // 回溯,撤销当前选择}}}// 检查当前位置(row, col)是否安全bool isValid(int row, int col, int n, vector<string> &board) {// 检查当前列上是否已有皇后for (int i = row; i >= 0; i--) {if (board[i][col] == 'Q') return false;}// 检查左上对角线是否已有皇后for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (board[i][j] == 'Q') return false;}// 检查右上对角线是否已有皇后for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (board[i][j] == 'Q') return false;}// 如果没有冲突,返回truereturn true;}public:// 主函数,用于返回所有的解法vector<vector<string>> solveNQueens(int n) {ans.clear(); // 清空之前的解// 创建一个n行n列的棋盘,初始化所有位置为'.'vector<string> board(n, string(n, '.'));// 从第一行开始回溯搜索backtrack(n, 0, board);// 返回所有解法return ans;}
};
以思路一为例进行调试
#include<iostream>
#include<string>
#include<vector>
#include<unordered_set>
using namespace std;class Solution1 {
private:// 用于存储所有解法的答案vector<vector<string>> ans;// 回溯函数,用于寻找解决问题的所有方法void backtrack(int n, int row, vector<string> &board) {// 递归出口,当所有行都填满时,表示找到一个解if (row == n) {ans.emplace_back(board); // 将当前的棋盘布局加入答案中return;}// 遍历当前行的每一列,尝试在每一列放置皇后for (int col = 0; col < n; col++) {// 检查当前位置是否安全,安全则放置皇后if (isValid(row, col, n, board)) {board[row][col] = 'Q'; // 放置皇后backtrack(n, row + 1, board); // 递归处理下一行board[row][col] = '.'; // 回溯,撤销当前选择}}}// 检查当前位置(row, col)是否安全bool isValid(int row, int col, int n, vector<string> &board) {// 检查当前列上是否已有皇后for (int i = row; i >= 0; i--) {if (board[i][col] == 'Q') return false;}// 检查左上对角线是否已有皇后for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (board[i][j] == 'Q') return false;}// 检查右上对角线是否已有皇后for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {if (board[i][j] == 'Q') return false;}// 如果没有冲突,返回truereturn true;}public:// 主函数,用于返回所有的解法vector<vector<string>> solveNQueens(int n) {ans.clear(); // 清空之前的解// 创建一个n行n列的棋盘,初始化所有位置为'.'vector<string> board(n, string(n, '.'));// 从第一行开始回溯搜索backtrack(n, 0, board);// 返回所有解法return ans;}
};
int main() {// 创建 Solution1 类的对象 s1,用于求解 N 皇后问题Solution1 s1;// 调用 solveNQueens 函数求解 4 皇后问题,返回所有解的集合vector<vector<string>> ans = s1.solveNQueens(4);// 遍历所有的解,每个解是一个棋盘的布局for (auto &str : ans) {// 遍历当前棋盘布局中的每一行(每行是一个字符串)for (auto &c : str) {// 输出当前行的每个字符(每个字符是棋盘位置上的 '.' 或 'Q')cout << c << " " << endl;}// 每找到一个解后,输出两个换行符,以区分不同解cout << endl << endl;}// 返回 0,表示程序正常结束return 0;
}
LeetCode 热题 100_N 皇后 (62_51)原题链接
欢迎大家和我沟通交流(✿◠‿◠)
相关文章:
LeetCode 热题 100_N 皇后 (62_51_困难_C++)(递归(回溯))
LeetCode 热题 100_N 皇后(62_51) 题目描述:输入输出样例:题解:解题思路:思路一(递归(回溯)): 代码实现代码实现(思路一(递…...
Winform(C#) 项目保存页面
上一张我们已经实现了TCP和串口页面的数据展示,和保存控件 我们这一章,实现如何去,控制保存。 一、控件展示 CheckBox TextBox Button label Name: checkSaveImage checkDelete txtSaveDays txtSaveImagePath btnSelectIm…...
【LeetCode: LCR 126. 斐波那契数 + 动态规划】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
OSPF(开放路径最短优先)
ospf优先级:内部优先级默认为10,外部优先级默认为150 1.ospf的三张表 (1)邻居表 <记录邻居状态和关系> (2)拓扑表 <链路状态数据库> (3)路由表 <对链路状态数据库进…...
JAVA EE初阶 - 预备知识(四)
一、API API 即应用程序编程接口(Application Programming Interface),是一组定义、协议和工具,用于不同软件组件、应用程序或系统之间进行交互和通信。以下从多个方面详细介绍 API: 基本概念 接口规范:A…...
如何解决服务器端口被攻击:全面防护与快速响应
服务器端口被攻击是网络安全中常见的问题之一,尤其是当服务器暴露在公共网络上时,容易成为黑客的目标。攻击者可能通过扫描开放端口、利用漏洞或发动拒绝服务(DoS/DDoS)攻击来破坏服务器的正常运行。本文将详细介绍如何检测、防御…...
golang panic原理
数据结构与底层实现 Goroutine结构体 stack(栈内存范围) 结构体类型,包含 lo(低地址)和 hi(高地址)两个 uintptr 字段,描述 Goroutine 的栈内存区间 [lo, hi)。初始栈大小为 2KB&a…...
scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析
scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…...
【Elasticsearch】查询规则_query_rules
1.Query Rules 的定义与作用 Query Rules 是 Elasticsearch 提供的一种功能,允许用户根据预定义的规则动态调整搜索结果。它通过匹配查询的元数据(如用户输入、地理位置、用户兴趣等),对搜索结果进行定制化调整,例如固…...
Git备忘录(三)
设置用户信息: git config --global user.name “itcast” git config --global user.email “ helloitcast.cn” 查看配置信息 git config --global user.name git config --global user.email $ git init $ git remote add origin gitgitee.com:XXX/avas.git $ git pull or…...
用户的声音 | 文档结构化信息提取方案测评:LLM、开源模型部署与云端API,谁是合适选择?
文档预处理之文本化 近日,我们收到来自专业用户的使用心得,浅析结构化信息提取技术、技术选型及一些个人测试。 结构化信息提取的重要性 数据作为大模型时代的核心生产资料,其结构化处理能力直接影响AI系统的实用价值。尽管知识图谱、RAG等…...
vite调试node_modules下面插件
在使用vite进行开发的时候,我们可能想要修改node_modules中插件的源码.特别是集成一个SDK,需要调试去判断问题时,或者研究第三方源码时后; vite默认是走缓存的,所以当修改后不会看到你打印的日志,这个时候有几种方法可以选择; 方式…...
ES12 weakRefs的用法和使用场景
ES12 (ECMAScript 2021) 特性总结:WeakRef 1. WeakRef 概述 描述 WeakRef 是 ES12 引入的一个新特性,用于创建对对象的弱引用。弱引用不会阻止垃圾回收器回收对象,即使该对象仍然被弱引用持有。WeakRef 通常与 FinalizationRegistry 结合使…...
【Python】集合set详细讲解(语法、操作、集合运算、性能、使用场景)
文章目录 1. 语法1.1 使用 {} 定义1.2 使用 set() 定义 2. 特点3. 常用操作3.1 访问元素3.2 查找数据3.3 添加元素3.3.1 add() 方法3.3.2 update()方法 3.4 删除元素3.4.1 remove()方法3.4.2 discard()方法3.4.3 pop()方法3.4.4 clear()方法 3.5 集合运算3.5.1 并集:…...
网络安全大数据架构 网络安全之数据安全
🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 网络安全和数据安全 从狭义来说,网络安全指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或恶意的原因遭到破坏、更改、泄露&…...
(前端基础)CSS(一)
了解 Cascading Style Sheet:层叠级联样式表 CSS:表现层(美化网页)如:字体、颜色、边框、高度、宽度、背景图片、网页定位、网页浮动 css优势: 内容和表现分离网页结构表现统一,可以实现复用…...
Redis数据类型全景解析:从底层编码到应用反模式
一、核心数据类型矩阵 1.1 基础类型对比表 类型底层结构最大容量时间复杂度典型场景StringSDS/Embstr/Raw512MBO(1)读写缓存/计数器ListQuickList(ziplist)2^32-1元素头尾操作O(1)消息队列Hashziplist/hashtable2^32-1键值对O(1)平均对象存储Setintset/hashtable2^32-1成员O(…...
(蓝桥杯——10. 小郑做志愿者)洛斯里克城志愿者问题详解
题目背景 小郑是一名大学生,她决定通过做志愿者来增加自己的综合分。她的任务是帮助游客解决交通困难的问题。洛斯里克城是一个六朝古都,拥有 N 个区域和古老的地铁系统。地铁线路覆盖了树形结构上的某些路径,游客会询问两个区域是否可以通过某条地铁线路直达,以及有多少条…...
TypeScript跟js,es6这些的区别
TypeScript 一、TypeScript 是什么 想象 JavaScript 是一个自由奔放的艺术家,它在创作(编写代码)时不受太多约束,非常灵活,但有时也容易犯错且难以调试。而 TypeScript 就像是给这位艺术家配备了一套精确的工具和规范…...
flink-cdc同步数据到doris中
1 创建数据库和表 1.1 数据库脚本 这样直接创建数据库是有问题,因为后面发现superset连接使用doris://root:12345610.101.12.82:9030/internal.eayc?charsetutf8mb4 -- 创建数据库eayc create database if not exists ods_eayc; -- 创建数据表2 数据同步 2.1 f…...
debian MEDIATEK Corp. Device 7925 无线网卡驱动安装
总结:升级内核满足版本要求即可。 由于主板自带的wifi7网卡驱动在debian12中2无法安装,需要升级内核才可以使用因此直接将原debian12 升级为debian13 ,此部分参考文章https://zbowling.github.io/mt7925/installation/debian-ubuntu/ 文章最…...
从‘打架’到‘严丝合缝’:CREO装配干涉检查与零件修改避坑指南(含全局干涉分析)
CREO装配设计中的干涉检查与高效修改实战指南 在机械设计领域,装配干涉问题就像一场无声的"交通事故"——当零件在虚拟环境中相互碰撞时,实际生产中将导致昂贵的返工成本。CREO作为主流的三维设计软件,其装配模块提供了强大的干涉检…...
用FPGA和XDMA从零打造一个百兆网卡:我的踩坑记录与性能调优心得
用FPGA和XDMA从零打造一个百兆网卡:我的踩坑记录与性能调优心得 去年夏天,当我第一次将自制的FPGA网卡插入RK3399开发板时,满心期待能在iperf测试中看到接近百兆的传输速率。然而现实给了我一记重拳——发送速度卡在33.5Mbps就再也上不去了。…...
如何完整保存微信聊天记录?WeChatMsg终极解决方案指南
如何完整保存微信聊天记录?WeChatMsg终极解决方案指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCha…...
Hitboxer:解决游戏按键冲突的SOCD清理利器
Hitboxer:解决游戏按键冲突的SOCD清理利器 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在激烈的游戏对战中,你是否曾因同时按下相反方向键而导致角色行为异常?这种被称为S…...
Gramps家谱软件终极指南:三步构建专业家族历史数据库
Gramps家谱软件终极指南:三步构建专业家族历史数据库 【免费下载链接】gramps Source code for Gramps Genealogical program 项目地址: https://gitcode.com/gh_mirrors/gr/gramps Gramps是一款功能强大的开源家谱软件,专为家族历史研究者和爱好…...
163MusicLyrics终极指南:如何快速获取网易云和QQ音乐的歌词文件
163MusicLyrics终极指南:如何快速获取网易云和QQ音乐的歌词文件 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾经遇到过这样的情况:下载…...
Kubernetes Pod 状态同步机制
Kubernetes Pod状态同步机制解析 在分布式系统中,容器编排平台Kubernetes通过Pod状态同步机制确保集群资源与实际运行状态的一致性。这一机制不仅保障了应用的高可用性,还为运维人员提供了透明的状态管理能力。本文将深入探讨Pod状态同步的核心逻辑&…...
终极指南:如何快速将网站转换为可编辑的Figma设计
终极指南:如何快速将网站转换为可编辑的Figma设计 【免费下载链接】figma-html Convert any website to editable Figma designs 项目地址: https://gitcode.com/gh_mirrors/fi/figma-html 在当今快节奏的数字化时代,设计师和开发者之间的协作效率…...
Faster-MoA框架:优化多智能体系统通信与计算效率
1. Faster-MoA框架设计背景与核心挑战当前多智能体系统(MoA)在复杂推理任务中面临的根本矛盾,是分布式协作带来的性能提升与通信开销之间的平衡问题。传统全连接架构(All-to-all)下,9个智能体相互通信会产生…...
