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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
