62、回溯-N皇后

思路:

        N皇后问题要求在一个n×n的棋盘上放置n个皇后,使得它们不能相互攻击。皇后可以攻击同一行、同一列,以及两个对角线方向上的其他皇后。解决这个问题意味着找到所有可能的棋盘配置,每个配置都符合上述条件。 

1、初始化数据结构

  • 使用一个整型数组record来记录每个皇后的位置。其中record[i] = j表示第i行的皇后位于第j列。
  • 使用一个列表list来收集所有有效的棋盘配置。

2. 递归和回溯

利用递归函数遍历棋盘的所有可能状态,对每一行尝试放置一个皇后,并通过回溯方法探索所有可能的解决方案:

  • 递归函数定义:创建一个递归函数process2(i, record, n, list),其中i代表当前行,record用于记录皇后位置,n为棋盘大小,list用于存储所有合法的棋盘配置。
  • 终止条件:当当前行i等于n时,表示所有行都已经成功放置了皇后。此时根据record数组生成一个棋盘配置,加入到解决方案列表list中。

3. 验证放置是否有效

在递归中,对于每一行的每一列,检查放置皇后是否合法:

  • 列冲突:确保没有其他皇后在同一列。
  • 对角线冲突:确保没有其他皇后在两个可能的对角线上。
    • 这可以通过检查当前尝试放置的列的索引与之前每行皇后列的索引的差的绝对值是否等于行的差的绝对值来实现。

4. 生成棋盘配置

每当找到一个有效的皇后布局后,需要将其转换为棋盘的字符串表示形式:

  • 对于record中的每个元素(表示列位置),构造一个字符串,其中'Q'表示皇后的位置,而'.'表示空位。

5. 回溯

  • 每次尝试放置一个皇后后,进入下一行继续尝试。
  • 如果发现当前行的某个列位置导致无法找到有效配置,则回溯到上一行,改变皇后的位置,然后再次尝试。
  • 通过逐行递归和回溯,可以探索棋盘的所有可能状态,直到找到所有有效的解决方案。

通过这种结合递归与回溯的方法,N皇后问题可以被系统地解决,所有可能的棋盘配置都会被找到并记录。

class Solution {// 主函数,用于解决n皇后问题,接收棋盘大小n,返回所有合法的棋盘配置public List<List<String>> solveNQueens(int n) {if (n < 1) {return new ArrayList<>(); // 如果n小于1,直接返回空列表,因为没有可行的棋盘配置}int[] record = new int[n]; // 创建数组记录每一行皇后的列位置List<List<String>> list = new ArrayList<>(); // 存储所有有效的棋盘配置process2(0, record, n, list); // 从第0行开始递归处理放置皇后return list; // 返回所有找到的棋盘配置}// 递归函数,用于处理从第i行开始的皇后放置private void process2(int i, int[] record, int n, List<List<String>> list) {if (i == n) { // 如果已经处理完所有行List<String> childList = new ArrayList<>(); // 创建一个新的列表存储当前棋盘的一种配置for (int index = 0; index < record.length; index++) { // 遍历每一行int num = record[index]; // 获取当前行皇后的列位置StringBuilder builder = new StringBuilder(); // 使用StringBuilder构建每一行的字符串表示for (int j = 0; j < n; j++) { // 遍历每一列if (j == num) {builder.append('Q'); // 如果当前列是皇后的位置,添加'Q'} else {builder.append('.'); // 否则添加'.'}}childList.add(builder.toString()); // 将构建好的字符串加入到当前棋盘配置中}list.add(childList); // 将当前配置添加到解决方案列表中} else {// 尝试在当前行i放置皇后的所有可能列for (int j = 0; j < n; j++) {if (isValid(record, i, j)) { // 检查在第i行的第j列放置皇后是否有效record[i] = j; // 如果有效,记录这个位置process2(i + 1, record, n, list); // 递归处理下一行}}}}// 检查在第i行的第j列放置皇后是否会导致冲突public static boolean isValid(int[] record, int i, int j) {for (int k = 0; k < i; k++) { // 检查之前的每一行// 判断列冲突和对角线冲突if (j == record[k] || Math.abs(record[k] - j) == Math.abs(i - k)) { return false; // 如果有冲突,返回false}}return true; // 如果没有冲突,返回true}
}

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

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

相关文章

【粉丝福利】订阅专栏免费送机器学习matlab全家桶

订阅【建模与仿真】专栏免费送信号分解全家桶 建模与仿真 1.基于变分模态VMD的时序信号分解模型 2.基于多元变分模式MVMD的时序信号分解模型 3.基于经验模态EMD的时序信号分解模型 4.基于集合经验模态EEMD的时序信号分解模型 5.基于互补集合经验模态CEEMD的时序信号分解模…

NetBox 接入AD LDAP域控认证系统

简介 本文介绍了NetBox接入微软的AD LDAP认证的教程。 NetBox 系列文章&#xff1a;https://songxwn.com/categories/NetBox/ LADP 系列文章&#xff1a;https://songxwn.com/tags/ldap/ 已在NetBox 3.5-4.0版本验证过. 安装 安装系统基础软件包 sudo yum install -y ope…

java导出pdf(水印、页眉、表格、背景样式、页脚、饼图、柱图)

这里写自定义目录标题 controller层pdf模板RiskReportTemplate1(页脚、水印)多线程导出pdf数据pdf导出工具类(页眉、图片底纹、柱图、饼图、表格、一级二级标题)实体类pdf工具类&#xff08;根据html生成pdf文件&#xff09;页脚工具类柱图工具类饼图工具类 controller层 Post…

前端更优雅的使用 jsonp

前端更优雅的使用 jsonp 背景&#xff1a;最近项目中又使用到了 jsonp 这一项跨域的技术&#xff0c;&#xff08;主要还是受同源策略影响&#xff09;&#xff0c;下面有为大家提供封装好的函数及对应使用示例&#xff0c;欢迎大家阅读理解 文章目录 前端更优雅的使用 jsonp同…

【系统架构师】-选择题(四)

1、“41”视图 ①逻辑视图(Logical View)&#xff0c;设计的对象模型(使用面向对象的设计方法时)。 ②过程视图(Process View)&#xff0c;捕捉设计的并发和同步特征。系统集成师 ③物理视图(Physical View)&#xff0c;描述了软件到硬件的映射&#xff0c;反映了分布式特性。系…

【算法】人工蜂群算法,解决多目标车间调度问题,柔性车间调度问题

文章目录 复现论文什么是柔性作业车间调度问题&#xff1f;数据处理ABC算法编码解码种群初始化雇佣蜂操作IPOX交叉多点交叉 观察蜂操作侦察蜂操作算法流程 结果程序截图问询、帮助 复现论文 什么是柔性作业车间调度问题&#xff1f; 也叫多目标车间调度问题。 柔性作业车间调…

03 后端入参校验:自定义注解实现

03 后端入参校验&#xff1a;自定义注解实现 一、前言二、实现1、新建Spring Boot项目2、引入依赖3、新建注解类4、新建校验器5、全局异常处理器6、编写Controller7、新建实体类8、启动并测试 一、前言 在 Java 后端开发中&#xff0c;为了实现入参校验&#xff0c;常常会使用…

4月26(信息差)

&#x1f30d; 1170万台 华为跃升重回首位&#xff01;苹果跌至第五位 &#x1f384;工业软件大事件 —— OGG 1.0 发布&#xff0c;华为贡献全部源代码 ✨ 苹果发布 OpenELM&#xff1a;专为在设备端运行而设计的小型开源 AI 模型 1.FisheyeDetNet&#xff1a;首个基于鱼眼相…

Linux中的时间戳mtime,ctime,ctime

在Linux系统中&#xff0c;文件是数据的载体&#xff0c;它们不仅存储着信息&#xff0c;还具有许多元数据&#xff0c;如权限、所有者、大小以及时间戳等 一、时间戳类型 1 mtime(Modification Time) 即修改时间 。它记录了文件的最后一次修改时间&#xff0c;即文件内容最…

GraspNet-1Billion 论文阅读

这里写自定义目录标题 GraspNet-1Billion总体数据集评价指标网络pointnet&#xff1a;Approach Network:Operation Network&#xff1a;Tolerance Network 摘要相关工作基于深度学习的抓取预测算法抓取数据集点云深度学习 GraspNet-1Billion CVPR2020 上海交大 论文和数据集地…

MATLAB中左边的大括号最后一行为什么会留很大的空白——解决

看了一些帖子说改字体&#xff0c;但是并没有什么用&#xff0c;在此给出亲测有效的方法&#xff1a;改变矩阵的行间距 先说一下问题 上图中留有大块空白 **解决办法&#xff1a;**光标放在矩阵上 格式——矩阵——更改矩阵&#xff0c;在矩阵设置中选中“行高相等”&#xff…

专项学习:软件开发

数据结构 &#xff08;一&#xff09;、字符串 当是数字的时候直接入栈 当是运算符号的时候 就将栈的最上面两个数拿出进行运算 后 再将结果进栈 记住&#xff08;栈顶元素永远在运算符号的右边&#xff09; &#xff08;二&#xff09;、数组 &#xff08;三&#xff09;、树…

k8s calico vxlan式详解

之前的文章讲了k8s ipip模式的使用以及流量路径&#xff0c;本篇文章主要是来讲解一下vxlan 模式下pod 流量是如何通信的。 一、ipip模式转vxlan 修改calico backend参数 将calico_backend参数由bird设置为vxlan,因为vxlan部署不使用bgp 修改calico controllers的configmap…

G1垃圾收集器详解

G1收集器 G1(Garbage-Frist)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器,以及高概率满足GC停顿时间要求的同时,还具备高吞吐量性能的特性. G1将Java堆划分为多个大小相等的独立区域(Region),JVM目标似乎不超过2048个Region(JVM源码里TARGET_REGIO…

STM32自己从零开始实操01:原理图

在听完老师关于 STM32 物联网项目的所有硬件课程之后&#xff0c;就是感觉自己云里雾里&#xff0c;明明课程都认真听完了&#xff0c;笔记也认真记录&#xff0c;但是就是感觉学到的知识还不是自己。 遂决定站在老师的肩膀上自己开始设计项目&#xff0c;将知识变成自己的&am…

WSL2无法ping通本地主机ip的解决办法

刚装完WSL2的Ubuntu子系统时&#xff0c;可能无法ping通本地主机的ip&#xff1a; WSL2系统ip&#xff1a; 本地主机ip&#xff1a; 在powershell里输入如下的命令&#xff1a; New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias &quo…

Java中单例设计模式详解

Java中单例设计模式详解 在Java编程中&#xff0c;单例设计模式是一种创建对象的设计模式&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点来访问这个唯一实例。单例模式在很多场景下都非常有用&#xff0c;比如配置文件读取、线程池管理、缓存管理等。…

http基础了解

超文本传输协议&#xff08;HTTP&#xff09;是一个用于传输超媒体文档&#xff08;例如 HTML&#xff09;的应用层协议。它是为 Web 浏览器与 Web 服务器之间的通信而设计的&#xff0c;但也可以用于其他目的。HTTP 遵循经典的客户端—服务端模型&#xff0c;客户端打开一个连…

Nginx入门-01

必备知识 DNS域名解析 hostName主机名称其实就是我们的域名 www.baidu.com是一个域名 www.taobao.com也是一个域名 localhost也是一个域名 我们可以根据域名dns解析成ip地址 域名的存在就是为了方便我们的记忆&#xff0c;最终访问的时候还是要转换成服务器的IP地址进行…

Python编程----递归求解兔子的数量

描述 兔子的数量以这样的方式增长&#xff1a;每个月的兔子数量等于它前一个月的兔子数量加它前两个月的兔子数量&#xff0c;即f(n)f(n-1)f(n-2)。假设第1个月的兔子有2只&#xff0c;第2个月的兔子有3只&#xff0c;你能使用递归的方法求得第n个月的兔子有多少只吗&#xff…