leetcode51.N皇后(困难)-回溯法

 思路

都知道n皇后问题是回溯算法解决的经典问题,但是用回溯解决多了组合、切割、子集、排列问题之后,遇到这种二维矩阵还会有点不知所措。

首先来看一下皇后们的约束条件:

  1. 不能同行
  2. 不能同列
  3. 不能同斜线

确定完约束条件,来看看究竟要怎么去搜索皇后们的位置,其实搜索皇后的位置,可以抽象为一棵树。

下面我用一个 3 * 3 的棋盘,将搜索过程抽象为一棵树,如图:

 从图中,可以看出,二维矩阵中矩阵的高就是这棵树的高度,矩阵的宽就是树形结构中每一个节点的宽度。

那么我们用皇后们的约束条件,来回溯搜索这棵树,只要搜索到了树的叶子节点,说明就找到了皇后们的合理位置了

然后套用递归三部曲解决。

  • 递归函数参数
  • 递归终止条件
  • 单层搜索的逻辑

这里还要外加一个 :验证棋盘是否合法

按照如下标准去重:

  1. 不能同行
  2. 不能同列
  3. 不能同斜线 (45度和135度角)

 java版本代码:

class Solution {List<List<String>> res = new ArrayList<>(); //全局变量res集合,用于存储解决方案的列表// 解决N皇后问题的方法,返回解决方案的集合public List<List<String>> solveNQueens(int n) {char[][] chessboard = new char[n][n]; // 创建一个N*N的字符棋盘for (char[] c : chessboard) {Arrays.fill(c, '.'); // 初始化棋盘,填充为'.'}backTrack(n, 0, chessboard); // 调用回溯方法,开始搜索解决方案return res; // 返回所有解决方案的集合}// 回溯方法,用于搜索解决N皇后问题的解决方案// n 为输入的棋盘大小// row 是当前递归到棋盘的第几行了public void backTrack(int n, int row, char[][] chessboard) {if (row == n) { // 终止条件:如果已经填满了所有行,即找到了一种解决方案res.add(Array2List(chessboard)); // 将当前棋盘状态添加到解决方案的集合中(list集合里的元素还是个集合list,见示例)return;}for (int col = 0; col < n; ++col) { // 遍历当前行的所有列if (isValid(row, col, n, chessboard)) { // 如果当前位置可以放置皇后chessboard[row][col] = 'Q'; // 放置皇后backTrack(n, row + 1, chessboard); // 递归搜索下一行的解决方案chessboard[row][col] = '.'; // 回溯,撤销当前位置的皇后(把Q替换成 .即可)}}}// 将二维字符数组转换为字符串集合public List Array2List(char[][] chessboard) {List<String> list = new ArrayList<>(); // 创建一个空集合for (char[] c : chessboard) { // 遍历棋盘的每一行 字符数组:char[] c,eg:{"Q",".",".",".",} 、list.add(String.copyValueOf(c)); // 将当前行的字符数组char[] c 转换为字符串并添加到集合list中}return list; // 返回转换后的集合 eg:[".Q..","...Q","Q...","..Q."]}// 检查当前位置是否可以放置皇后isValid()方法  :从上往下去找的,所以对角线只找了左上和右上public boolean isValid(int row, int col, int n, char[][] chessboard) {// 检查同一列是否已经放置了皇后for (int i = 0; i < row; ++i) { // 遍历当前列之前的所有行if (chessboard[i][col] == 'Q') { // 如果当前位置上方有皇后return false; // 返回false,表示当前位置不能放置皇后}}// 检查45度对角线上是否已经放置了皇后for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { // 向左上方遍历if (chessboard[i][j] == 'Q') { // 如果当前位置左上方有皇后return false; // 返回false,表示当前位置不能放置皇后}}// 检查135度对角线上是否已经放置了皇后for (int i = row - 1, j = col + 1; i >= 0 && j <= n - 1; i--, j++) { // 向右上方遍历if (chessboard[i][j] == 'Q') { // 如果当前位置右上方有皇后return false; // 返回false,表示当前位置不能放置皇后}}return true; // 如果以上条件都不满足,表示当前位置可以放置皇后,返回true}
}

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

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

相关文章

Python爬虫(入门版)

1、爬虫是什么 简单的来说&#xff1a;就是用程序获取网络上数据。 2、爬虫的原理 如果要获取网络上数据&#xff0c;我们要给爬虫一个网址&#xff08;程序中通常叫URL&#xff09;&#xff0c;爬虫发送一个HTTP请求给目标网页的服务器&#xff0c;服务器返回数据给客户端&am…

jdbc的工具类和三层架构模型

jdbc工具类 由于JDBC的注册驱动&#xff0c;连接数据库&#xff0c;关闭资源的步骤是相同的&#xff0c;所以我们可以写一个JDBC工具类。 /* 工具类&#xff1a; 私有化构造方法 提供静态方法*/ public class jdbcUtil {private final static String DRIVER "com.mysql…

Java设计模式 _创建型模式_建造者模式(Builder)

一、建造者模式 1、建造者模式&#xff08;Builder Pattern&#xff09;是一种创建对象的设计模式。它允许你使用不同的构建策略来创建复杂对象。通常是在复杂类中通过静态内部类&#xff08;Builder&#xff09;来进行构建。 2、实现思路&#xff1a; &#xff08;1&#xf…

异地组网、网络部署、无线覆盖,贝锐蒲公英一步到位

面对网络架构复杂的企业总部&#xff0c;分散在各地的分支机构&#xff0c;以及出差的远程办公人员&#xff0c;如何才能高效异地组网&#xff1f; 为了确保总部、分部网络实现远程稳定、高速互访&#xff0c;以及远程人员安全访问总部业务系统&#xff0c;基于自研SD-WAN的贝…

C++ 小游戏:战斗之旅

一、游戏名称&#xff1a;战斗之旅 游戏规则 角色选择&#xff1a;玩家可以选择不同的角色&#xff0c;每个角色都有不同的属性和技能。商城&#xff1a;玩家可以访问商城购买不同的装备&#xff0c;包括武器和回复物品。战斗&#xff1a;玩家可以与其他角色进行战斗。在战斗…

极语言在全屏游戏中,按住D同时按X键,松开X键,再松开D键的程序

程序段 模拟按键(布尔 按住D, 布尔 按住X); 定义按键常量整数 VK_D 0x44整数 VK_X 0x58; 检测D和X键是否同时按住如果(按住D 和 按住X){; 模拟松开X键按键消息(VK_X, 0, 0, "keyup"); 模拟松开D键&#xff08;稍后一些执行&#xff0c;以确保X键先松开&#xff09;…

使用Docker搭建Nacos集群

本次是在Mac的M1版本上使用Docker搭建Nacos集群的详细步骤&#xff0c;并记录了一些遇到的问题及解决方案。 搭建涉及&#xff1a;1个Nginx 3个Nacos 1个MySQL 使用版本&#xff1a;Nginx为1.22.0&#xff0c;Nacos为2.0.3&#xff0c;MySQL为8.0.30 一、创建虚拟网络 因为M…

数据结构(01)——链表OJ

目录 移除链表元素 思路1 不创建虚拟头节点 思路2 创建虚拟头节点 反转链表 寻找链表中间节点 判断链表是否相交 回文链表 环形链表 环形链表|| 移除链表元素 . - 力扣&#xff08;LeetCode&#xff09; 要想移除链表的元素&#xff0c;那么只需要将目标节点的前一…

XMind轮播图banner测试点

banner测试点 显示1到5张banner图片 [1,5] 6 1 一张不轮播 5 3 0可选 自动轮播,3秒切换一张 鼠标悬停,不轮播 实心为当前图 点击可以跳转 点击左,切换一张图片 点击右, 切换一张图片…

Arch Linux安装macOS

安装需要的包 sudo pacman -S qemu-full libvirt virt-manager p7zip yay -S dmg2img安装步骤 cd ~ git clone --depth 1 --recursive https://github.com/kholia/OSX-KVM.git cd OSX-KVM # 选择iOS版本 ./fetch-macOS.py #将上一步下载的BaseSystem.dmg转换格式 dmg2img -…

【Git】如何在.gitignore忽略已经被上传到git上的文件,并且同步到线上

【Git】如何在.gitignore忽略已经被上传到git上的文件&#xff0c;并且同步到线上 如果你想要 .gitignore 忽略已经上传到 Git 仓库的文件&#xff0c;但是希望在远程仓库上也排除这些文件&#xff0c;你需要执行以下步骤&#xff1a; 更新 .gitignore 文件: 首先&#xff0c;…

【中级软件设计师】上午题12-软件工程(3):项目活动图、软件风险、软件评审、软件项目估算

【中级软件设计师】上午题12-软件工程&#xff08;3&#xff09; 1 软件项目估算1.1 COCOMO估算模型1.2 COCOMOⅡ模型 2 进度管理2.1 gantt甘特图2.2 pert图2.3 项目活动图2.3.1 画项目图 3 软件配置管理4 软件风险4.1 风险管理4.2 风险识别4.3 风险预测4.4 风险评估4.5 风险控…

Baidu comate智能编程助手评测

Baidu comate智能编程助手评测 作者&#xff1a;知孤云出岫 目录 一&#xff0e; 关于comate产品 二&#xff0e; 关于comate产品体验 三&#xff0e; 关于实际案例. 四&#xff0e; 关于baidu comate编程助手的实测体验感悟 五&#xff0e; …

Java包装类,128陷阱

包装类 基本数据类型都有自己对应的包装类&#xff0c;因为Java本质是面向对象编程的&#xff0c;一切的内容在Java看来都是对象 但是基本数据类型没有类&#xff0c;也没有对象&#xff0c;这样就有了矛盾 所以诞生了基本类型的包装类 基本数据类型&#xff1a; byte,short,…

014、Python+fastapi,第一个后台管理项目走向第14步:建立python+fastapi项目,创建common通用模块

一、说明 通用模块主要是完成文件的上传下载&#xff0c;抄吧&#xff0c;要不然怎么叫通用模块呢&#xff1f; 我把RuoYi-Vue3-FastAPI中的验证码模块放在这里了&#xff0c;我觉得验证也比较通用吧&#xff0c; 二、添加common通用模块 1、通用模块没有数据表&#xff0c…

冯喜运:4.30现货黄金涨跌互现,最新黄金原油趋势分析

【黄金消息面分析】&#xff1a;上周五公布的数据&#xff0c;美国3月核心PCE年率维持前值不变&#xff0c;美国4月一年期通胀率预期上升&#xff0c;显示通胀顽固并有所回升&#xff0c;但其经济数据美国3月个人支出月率和美国4月密歇根大学消费者信心指数终值则低于预期和前值…

WEB攻防-PHP特性-metinfoCMS审计实例

前置知识&#xff1a;PHP函数缺陷 测试环境&#xff1a;MetInfo CMS 函数缺陷导致的任意文件读取 漏洞URL&#xff1a;/include/thumb.php?dir 漏洞文件位置&#xff1a;MetInfo6.0.0\app\system\include\module\old_thumb.class.php <?phpdefined(IN_MET) or exit(No…

深度学习 --- stanford cs231学习笔记(一)

stanford cs231学习笔记(一) 1&#xff0c;先是讲到了机器学习中的kNN算法&#xff0c;然后因为kNN分类器的一些弊端&#xff0c;引入了线性分类器。 kNN算法的三大弊端&#xff1a; (1)&#xff0c;计算量大&#xff0c;当特征比较多时表示性差 (2)&#xff0c;训练时耗时少…

慢SQL问题全解析:原因诊断与性能优化策略

慢SQL的定义&#xff1a; 执行时间长的 慢SQL的筛选&#xff1a; 1.使用MySQL自带的日志 查看慢查询日志是否开启&#xff1a; SHOW VARIABLES LIKE %slow_query_log%; 开启慢查询日志&#xff1a;使用该方法开启MySQL的慢查询日志只对当前数据库生效&#xff0c;如果MySQ…

HF区块链链码基础

链码生命周期 一 . 链码准备 准备文件 . 在测试目录下创建chaincode,拷贝测试链码进 chaincode目录,拷贝 set-env.sh 脚本进 scripts 目录 二. 打包链码 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.…