(回溯) LeetCode 51. 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

二. 解题思路

本题意思也是十分简单,在一块二维数组中进行分布,要求在一点分布了Q之后,该点所在行,列以及对角就不能再出现Q,你需要输出所有在棋盘上的合法分布。

这个题目看起来比较简单,但是做起来还是有些费劲的,你得遍历枚举所有的可能,然后再每一个点上判断加入Q中是否合法,一听头都大了,不要慌!!我们来用回溯给它秒了!

1. 确定递归参数:首先需要一个chessboard 的一维字符串数组用来存储路径中的值,其次需要一个n 用来记录棋盘的大小,再有就是一个row 记录行数。

2. 确定递归的结束条件:当row == n 的时候就说明已经遍历到最后一行了,可以收集结果并且return了。

3. 单层循环递归:首先得确定在第row 行第 i 列放置皇后(Q) 是合法的(有一个isValid 函数专门判断是否合法),如果不合法,进行下一次的循环,如果合法,就将该位置放置皇后,然后进行递归处理,等到递归返回之后回溯即可。

4. 判断是否合法函数(isValid):我们只需要确定该点所在的列和对角上不存在皇后即可,这个函数书写比较简单,具体大家可以看下面的代码。

下图是代码随想录中对具体回溯的一个举例,大家可以参考:

话不多说!!!上代码!!

三. 代码

class Solution {
public:vector<vector<string>> res;bool isValid(vector<string>& chessboard, int n, int col, int row){// 检查列for(int i = 0; i < row; i++){               // 只需要检查 0~row 列有没有Q即可if(chessboard[i][col] == 'Q'){return false;}}// 检查45度for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--){if(chessboard[i][j] == 'Q'){return false;}}// 检查135度for(int i = row - 1, j = col + 1; i >= 0 && j<= n; i--, j++){if(chessboard[i][j] == 'Q'){return false;}}return true;}void back(vector<string>& chessboard, int n, int row){if(n == row){res.push_back(chessboard);return;}for(int i = 0; i < n; i++){if(isValid(chessboard, n, i, row)){chessboard[row][i] = 'Q';back(chessboard, n, row + 1);chessboard[row][i] = '.';}}}vector<vector<string>> solveNQueens(int n) {res.clear();vector<string> chessboard(n, string(n, '.'));back(chessboard, n, 0);return res;}
};

四. 总结

本题相对于比较难理解一些,建议大家先将我之前发布的几篇回溯文章能够独立完成,这样大家只要能够细心并且静下心来思考就一定能够明白这道题,加油!!!

时间复杂度:O(n!);

空间复杂度:O(n)。

喜欢的话给个关注吧!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/398217.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云AI代码助手:智能AI代码助手 ,新一代的高效代码开发辅助工具

前言 近些年是一个科技大爆发的时代&#xff0c;自从大模型发布以来越来越多的科技产品出现。例如去年的智能编码助手自出现以来&#xff0c;各大老牌大厂腾讯&#xff0c;百度 阿里也都紧随其后&#xff0c;智能编码助手的出现可以说大大的节省了我们写一些冗余代码的时间成本…

十七、访问者模式

文章目录 1 基本介绍2 案例2.1 Element 接口2.2 Vehicle 抽象类2.3 Car 类2.4 Jeep 类2.5 VehicleCollection 类2.6 Action 抽象类2.7 Repair 类2.8 Drive 类2.9 Client 类2.10 Client 类的运行结果2.11 总结 3 各角色之间的关系3.1 角色3.1.1 Element ( 元素 )3.1.2 ConcreteE…

靓图!多点创新!CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解+卷积长短期+注意力多元时间序列预测

靓图&#xff01;多点创新&#xff01;CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解卷积长短期注意力多元时间序列预测 目录 靓图&#xff01;多点创新&#xff01;CEEMDAN-Kmeans-VMD-CNN-LSTM-Attention双重分解卷积长短期注意力多元时间序列预测效果一览基本介绍程序设计…

LVS 调度器 nat和DR模式

lvs-nat 修改请求报文的目标IP,多目标IP的DNAT 配置网络 LVS主机 注意网卡的顺序 &#xff08;nat和主机模式&#xff09; [rootlvs ~]# cat /etc/NetworkManager/system-connections/ens160.nmconnection [connection] idens160 typeethernet interface-nameens160 ​ [ip…

Linux使用学习笔记3 系统运维监控基础

系统运维监控类命令 查询每个进程的线程数 for pid in $(ps -ef | grep -v grep|grep "systemd" |awk {print $2});do echo ${pid} > /tmp/a.txt;cat /proc/${pid}/status|grep Threads > /tmp/b.txt;paste /tmp/a.txt /tmp/b.txt;done|sort -k3 -rn for pid…

数据结构与算法-16高级数据结构_图论(图论基础)

图论基础 1 什么是图 1.1 基础定义 图&#xff08;Graph&#xff09;是一个用于描述一组对象之间关系的数学结构。这些对象被称为顶点&#xff08;Vertex&#xff09;&#xff0c;也称为节点&#xff08;Node&#xff09;或点&#xff08;Point&#xff09;&#xff0c;而对…

2024国赛Word论文模板【一键生成式操作】

一、比赛介绍 该竞赛创办于1992年&#xff0c;每年一届&#xff0c;是首批列入“高校学科竞赛排行榜”的19项竞赛之一。2023年&#xff0c;来自全国及美国、澳大利亚、马来西亚的1685所院校/校区、59611队(本科54158队、专科5453队)、近18万人报名参赛。 而今年的国赛马上就要…

【CTF | WEB】001、攻防世界WEB题目之backup

文章目录 backup题目描述:解题思路&#xff1a;解题过程&#xff1a; backup 题目描述: X老师忘记删除备份文件&#xff0c;他派小宁同学去把备份文件找出来,一起来帮小宁同学吧&#xff01; 进入题目后显示&#xff1a; 解题思路&#xff1a; 在进行网站安全检查时&#xf…

网络协议四 物理层,数据链路层

从这一节开始学习 五层模型。学习方法是从最底层物理层开始学习 七层模型 五层模型 各个层用的协议&#xff0c;以及加上协议后的称谓 各个层的作用 应用层&#xff1a;可以认为是原始数据&#xff0c;该数据称为 报文&#xff0c;用户数据。 运输层&#xff1a;也叫传输层&am…

全网超详细攻略——LVS原理详解及部署

目录 一、LVS原理 1.LVS简介 2.LVS结构 3.IP负载均衡技术 4.LVS相关术语 二、LVS负载均衡四种工作模式 1.LVS-DR模式 2.LVS-NAT模式 3.LVS-TUN模式&#xff08;了解&#xff09; 4.FULL-NAT模式&#xff08;了解&#xff09; 三、LVS负载均衡十种调度算法 四、LVS部…

米思奇安装——Mac版本

米思奇安装——Mac版本 1.下载 访问米思奇官网https://mixly.org/bnu-maker/mixl2.0rc 打开官网后在首页点击导航栏的软件平台&#xff0c;选择Mixly离线版 点击Mixly2.0RC4发布下载。 进入百度网盘分享的文件&#xff0c;选择Mac一键更新版本&#xff0c;等待下载完成。 …

尚品汇-ES(三十一)

目录&#xff1a; &#xff08;1&#xff09;封装搜索相关实体对象 &#xff08;2&#xff09;搜索接口封装 &#xff08;3&#xff09;在service-list-client模块添加远程接口 &#xff08;1&#xff09;封装搜索相关实体对象 搜索参数实体&#xff1a;SearchParam 搜索参…

第七节 流编辑器sed(stream editor)(7.1)

一,sed简介 sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有改变 二,sed的语法 2,1,基本语法 sed options ... […

AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例

AI学习记录已经发了十几篇&#xff0c;大佬们可以看看&#xff0c;如果有帮助动动小手点赞 token入门版&#xff0c;有空会更新具体代码操作 GPT4当中&#xff0c;我们提问问题是按照token进行扣费的&#xff0c;那到底什么是token&#xff1f; 在不同的语言模型当中&#x…

gradio之进度条

输出控件显示进度&#xff0c;进度结束显示控件结果 import gradio as gr import timedef slowly_reverse(word, progressgr.Progress()):progress(0, desc"Starting")time.sleep(1)progress(0.05)new_string ""for letter in progress.tqdm(word, desc&…

C++ 特性之vector详解 + 联合opencv使用

C 特性之vector详解 联合opencv使用 在C中&#xff0c;遍历vector并删除元素需要小心处理迭代器失效的问题。通常推荐的方法是使用迭代器进行遍历&#xff0c;并在需要删除元素时使用erase函数。这里给出一个示例代码&#xff0c;演示如何安全地遍历vector并删除特定条件的元…

计算机毕业设计 家电销售展示平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

智能识别,2024年SD卡数据恢复软件的智能进化

除了手机之外现在有不少的设备还是依靠SD卡来存储数据&#xff0c;比如相机、摄像头、无人机等。有的时候会因为一些意外的情况导致数据丢失&#xff0c;那是真的丢失了吗&#xff1f;大部分情况还是可以依靠sd卡数据恢复工具来找回这些“消失”的数据哦。 1.福昕数据恢复 链…

python正则表达式以及re模块的运用完成文本处理(搜索、匹配、替换等文本操作)

1.正则表达式 正则表达式是一种强大的文本处理工具&#xff0c;用于搜索、匹配、替换等文本操作。 2.通过re模块实现正则表达式的操作 Python中的re模块是Python的标准库之一&#xff0c;它提供了对正则表达式的支持。正则表达式是一种强大的文本处理工具&#xff0c;用于搜…

AI赋能招聘:效率与公平的双重提升

一、引言&#xff1a;AI赋能招聘新纪元 在21世纪的数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术以前所未有的速度渗透到社会经济的各个领域&#xff0c;深刻地改变着我们的生活方式与工作模式。人力资源管理&#xff0c;作为企业战略的重要组成部分&#…