【LeetCode热题100】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

四.解题思路

N皇后问题在某种程度上可以看作是一种“升维”的全排列问题。在N皇后问题中,我们需要在一个N×N的棋盘上放置N个皇后,使得这些皇后不能相互攻击,即它们不能位于同一行、同一列或同一对角线上。如果我们将每个皇后的位置看作一个决策(即在某行放置一个皇后),那么这个问题就转化为了在每一行选取一个列位置来放置皇后,而且每一列只能选择一次。

全排列与N皇后的联系
全排列:在全排列问题中,我们需要对一个包含N个元素的集合进行排列,每个元素恰好出现一次,顺序可以不同。可以将N个元素的全排列看作是从N个位置中选取N个位置放置这N个元素,每个位置恰好使用一次。

N皇后问题:如果我们将每一行看作是选择的“元素”,将每一列看作是可选择的“位置”,那么在每一行选择一个列位置来放置皇后的过程,与全排列问题中从N个位置中选择位置来放置N个元素的过程相似。每一行选择一个列位置来放置皇后,确保每一列都恰好被选用一次,这就形成了一个排列。不过,N皇后问题还需要满足附加的约束条件——即放置的皇后之间不能互相攻击,这需要检查对角线方向的冲突。

对于升维的理解
将N皇后问题视为一种“升维”的全排列问题,是因为除了需要满足全排列的基本要求(每行放置一个皇后,且每列只能放置一个皇后,形成一个排列)之外,还需要额外满足不在同一对角线上的约束。这个额外的约束条件相当于在传统的全排列问题基础上增加了新的维度的考虑(即对角线的检查),使问题变得更加复杂。

五.代码实现

class Solution {
public:bool checkCol(vector<vector<char>>& board, int row, int col) {for (int i = 0; i < row; i++) {if (board[i][col] == 'Q')return false;}return true;}bool checkLT(vector<vector<char>>& board, int row, int col) {for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {if (board[i][j] == 'Q')return false;}return true;}bool checkRT(vector<vector<char>>& board, int row, int col) {for (int i = row - 1, j = col + 1; i >= 0 && j < board.size(); i--, j++) {if (board[i][j] == 'Q')return false;}return true;}vector<vector<string>> solveNQueens(int n) {vector<vector<char>> board(n, vector<char>(n, '.'));vector<vector<string>> ans;dfs(ans, board, 0, n);return ans;}void dfs(vector<vector<string>>& ans, vector<vector<char>>& board, int row, int n) {if (row == n) {vector<string> oneAns;for (int i = 0; i < n; i++) {string r;for (int j = 0; j < n; j++) {r += board[i][j];}oneAns.push_back(r);}ans.push_back(oneAns);}for (int i = 0; i < n; i++) {if (checkCol(board, row, i) && checkLT(board, row, i) && checkRT(board, row, i)){board[row][i] = 'Q';dfs(ans, board, row + 1, n);board[row][i] = '.';}}}
};

六.题目总结

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

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

相关文章

4.3学习总结

[HNCTF 2022 WEEK2]Canyource&#xff08;无参数&#xff09; 通过这题又接触了一种无参数RCE的方法&#xff0c;前面学习的getallheaders只有在apache环境下才能使用&#xff0c;具有一定的局限性 这里是利用php函数来构造读取flag的方法 localeconv() – 函数返回一个包含本…

数字资产与数据资产的区别

在当今的数字时代&#xff0c;数字资产和数据资产是两个经常被提及的概念。虽然它们都与数字领域有关&#xff0c;但它们有着明显的区别。 数字资产是指以数字形式存在的、具有一定价值的资产。这些资产可以是数字货币、数字版权、数字艺术品、虚拟世界中的资产等。数字资产的…

OpenGL/DirectX/Metal/Vulkan

我想了解一下上面提到的东西&#xff0c;大体上指什么&#xff1f; DirectX、Vulkan和OpenGL是什么&#xff1f;什么是图形API&#xff1f;_哔哩哔哩_bilibili 图形API&#xff1a;图形化的应用程序编程接口 Vulkan和OpenGL都是图形API。 OpenGL:开源&#xff0c;跨平台 …

PyTorch示例——使用Transformer写古诗

文章目录 PyTorch示例——使用Transformer写古诗1. 前言2. 版本信息3. 导包4. 数据与预处理数据下载先看一下原始数据开始处理数据&#xff0c;过滤掉异常数据定义 词典编码器 Tokenizer定义数据集类 MyDataset测试一下MyDataset、Tokenizer、DataLoader 5. 构建模型位置编码器…

当Pycharm中右键运行python程序时出现Run ‘pytest in tests ***py‘,如何解决?

1、在Pycharm中右键运行python程序时出现Run pytest in tests ***py &#xff0c;这是进入了Pytest模式。 2、解决办法 进入到File->Settings->Tools->Python integrated Tools页面或者快捷键&#xff08;CtrlAltS&#xff09; 找到Testing下的Default test runner …

CSS属性排序的插件和包

原文链接 pnpm i stylelint postcss postcss-html stylelint-config-standard stylelint-config-prettier stylelint-config-recess-order stylelint-config-html stylelint-config-recommended-scss stylelint-config-standard-scss -Dpnpm add stylelint-order -D添加文件&a…

Ubuntu Desktop 安装有道词典

Ubuntu Desktop 安装有道词典 1. 有道词典2. Installation2.1. 解压 deb 包到 youdao 目录2.2. 解压 deb 包中的 control 信息 (包的依赖写在该文件里面)2.3. 编辑 control 文件&#xff0c;删除依赖里面的 gstreamer0.10-plugins-ugly2.4. 创建 youdaobuild 目录&#xff0c;重…

Openstack(T)部署ceph集群 ceph-14.2.22-nautilus

https://www.cnblogs.com/liugp/p/12513702.html 我的部署参考上述文档&#xff0c;以下针对部署有不同的地方进行说明 1.节点的ceph源进行修改 [Ceph] nameCeph packages for $basearch baseurlhttp://download.ceph.com/rpm-nautilus/el7/$basearch enabled1 gpgcheck1 ty…

大模型量化技术-GPTQ

大模型量化技术-GPTQ 2022年,Frantar等人发表了论文 GPTQ:Accurate Post-Training Quantization for Generative Pre-trained Transformers。 这篇论文详细介绍了一种训练后量化算法,适用于所有通用的预训练 Transformer模型,同时只有微小的性能下降。 GPTQ算法需要通过…

rocketmq的运维

1. admintool创建topic的时候 -o 的用法含义 https://rocketmq.apache.org/zh/docs/4.x/producer/03message2/ 有关orderMessageEnable和returnOrderTopicConfigToBroker的设置可以参考 https://blog.csdn.net/sdaujsj1/article/details/115741572 -c configFile通过-c命令指…

typdef:深入理解C语言中typdef关键词的用法

typedef&#xff1a;C语言中的类型重命名关键词 在C语言中&#xff0c;typedef 是一个非常有用的关键词&#xff0c;它允许我们为现有的数据类型定义一个新的名称。这不仅使得代码更加清晰易读&#xff0c;还提高了代码的可维护性。在这篇博客中&#xff0c;我们将深入探讨 ty…

小核引导RTOS

参考 参考1. How does FSBL load the FreeRTOS on the small core and execute it?参考2. Duo now supports big and little cores?Come and play!Milk-V Duo, start&#xff01; 日志 FSBL Jb2829:g362832ac6-dirty:2024-04-02T13:31:1100:00 # 版本信息 st_on_reason…

typescript的工作流

先coding code.ts代码&#xff0c;由tsc编译code.ts生成code.js格式 npm install —save-dev lite-server 是用来安装轻量级的服务器&#xff0c;只是用来开发的一个服务器&#xff0c;真正到生产环境中时可能会使用类似于Apache的server或者汤姆猫一类的服务器&#xff0c;安…

编程生活day6--回文子串、蛇形填充数组、笨小猴、单词排序

回文子串 题目描述 给定一个字符串&#xff0c;输出所有长度至少为2的回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串&#xff0c;比如&#xff1a;abba&#xff0c;cccdeedccc都是回文字符串。 输入 一个字符串&#xff0c;由字母或数字组成。长度5…

spring-boot集成websocket

引入Maven依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><version>跟随spingboot版本</version> </dependency>后端代码 /*** 开启WebSocket支持*…

【嵌入式开发 Linux 常用命令系列 8 -- shell 命令 basename 介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 shell 命令 basenamedf 命令 shell 命令 basename 在 shell 脚本中&#xff0c;可以使用 basename 命令来获取文件的基本名称&#xff08;不带路径的部分&#xff09;。以下是如何将文件名赋值给变量的示例&#xff1a; file_pat…

STM32CubeMX配置步骤详解四 —— 基础配置(1)

接前一篇文章&#xff1a;STM32CubeMX配置步骤详解三 —— 安装 本文内容主要参考&#xff1a; STM32CUBEMX配置教程&#xff08;一&#xff09;基础配置-CSDN博客 特此致谢&#xff01; 三、STM32CubeMX基础配置 前边几回讲解了STM32CubeMX的下载及安装。当前STM32CubeMX已…

【leetcode面试经典150题】6.轮转数组(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

LeetCode575——分糖果

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 这道题比较简单&#xff0c;但我还是花费了将近四个小时的时间去解答&#xff0c;AC的那一刻&#xff0c;终于全身舒畅&#xff0c;这道题的思路就是先求出糖果的种数&#xff0c;然后我们从题中可以得出&#x…

MySQL数据库 数据库基本操作(二):表的增删查改(上)

1. CRUD CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写,就是数据库基本操作中针对表的一系列操作. 2. 新增(create) -->insert 语法: insert into 表名 [列名1,列名2…] values (val1,val2…) [注意] 列名可以没有,如果没有列名…