62、回溯-N皇后

news/2024/5/9 22:16:30

思路:

        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.mrgr.cn/p/33880551

相关文章

C++教学——从入门到精通 11.嵌套循环及数组

上次讲到了循环&#xff0c;这次来讲嵌套循环 如果一个人叫你用C来画一个10*10/2cm^2三角形会么&#xff1f; 这就要用到嵌套循环了 来看看结构&#xff1a; for(变量类型1 变量;条件1;返回值1){语句1;for(变量类型 变量2;条件2;返回值2){语句2;}语句3; } 语句1,2,3是依次…

视频滚动字幕一键批量轻松添加,解锁高效字幕编辑,提升视频质量与观众体验

视频已成为我们获取信息、娱乐休闲的重要渠道。一部成功的视频作品&#xff0c;除了画面精美、音质清晰外&#xff0c;字幕的添加也是至关重要的一环。字幕不仅能增强视频的观感&#xff0c;还能提升信息的传达效率&#xff0c;让观众在享受视觉盛宴的同时&#xff0c;更加深入…

【排课小工具】项目需求的搜集与整合

在小学实习期间(2024年3月1日 - 2024年7月10日),与老师的交流中发现,每当新学期开始都要人工排一次课表,并且这个过程较为繁琐,总是遇到教师课程冲突的状况,一旦发生这种情况,在重排的过程中就会影响到诸多已经排好的项目。如果能够解决上述排课冲突问题,那将会给排课…

实验14-1使用cnn完成MNIST手写体识别(tf)+实验14-2使用cnn完成MNIST手写体识别(keras)

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6 实验14-1使用cnn完成MNIST手写体识别(tf)运行结果: 代码:import tensorflow as tf # Tensorflow提供了一个类来处理MNIST数据 from tensorflow.examples.tutorials.mnist import input_data import time# 载入数据集 mn…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核&#xff0c;在Vivado的IP Catalog中可以查看这些IP核&#xff0c;在构建自己复杂的系统时&#xff0c;只使用Xilinx官方的免费IP核一般满足不了设计的要求&#xff0c;因此很多…

Android Dalvik虚拟机JNI方法的注册过程分析

Dalvik虚拟机在调用一个成员函数的时候&#xff0c;如果发现该成员函数是一个JNI方法&#xff0c;那么就会直接跳到它的地址去执行。也就是说&#xff0c;JNI方法是直接在本地操作系统上执行的&#xff0c;而不是由Dalvik虚拟机解释器执行。由此也可看出&#xff0c;JNI方法是A…

STM32H750时钟频率和功耗以及RTC功能测试

STM32H750时钟频率和功耗和RTC功能测试 &#x1f4cc;相关篇《STM32H750片外QSPI启动配置简要》 ✨在使用STM32CubeMX修改STM32H750时钟树参数时&#xff0c;如果使用软件自动求解&#xff0c;这是一个非常耗时的操作&#xff0c;有时候还不一定成功&#xff0c;还是推荐使用手…

数据库中间件-He3Proxy

什么是数据库中间件? 随着互联网行业的蓬勃发展,业务访问量、数据量激增,传统数据库的单库、大表已成为业务发展的瓶颈,进而衍生出数据库主从实例、分库分表等方案,为减少数据库层变动对业务开发带来的复杂性,一种连接应用与数据库桥梁的工具孕育而生,即数据库中间件,它…

JAVA前端快速入门基础_javascript入门(01)

写在前面:本文用于快速学会简易的JS&#xff0c;仅做扫盲和参考作用 1.JS是什么 JavaScript是一门跨平台&#xff0c;面向对象的脚本语言(即不需要编译&#xff0c;可以直接通过浏览器进行解释)。JS和Java是两门完全不相同的语言&#xff0c;但是基础的语法是类似的 2.JS的引…

MySQL学习之explain

from之后的查询得到的表叫做衍生表,是临时表数据,生成临时表之后的数据是无法使用索引的,如果数据量大查询效率就会比较低,这就是查询要尽量少使用子查询这些临时表。explain详解 id: 表示查询序号,也可以表示优先级;当值都不一样的时候,值越大表示优先级越高,越先执行…

实验12-使用keras预训练模型完成猫狗识别

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6 运行结果: 这里我用Gpu进行加速,训练一回9秒,如果不启用gpu,训练一回会很慢。 代码:#-*- codeing = utf-8 -*- #@Time : 2022/10/2 11:44 #@Author : 程浩 #@File : 猫狗识别.py #@Software: PyCharm import tensor…

KVM虚拟机迁移(静态)

1.查看虚拟机状态,确认关闭状态 virsh list --all 2.查看虚拟机文件位置 virsh domblklist zabbix3.导出配置文件并查看导出文件 virsh dumpxml zabbix > /root/zabbix.xml 4.把刚导出的配置文件传到目的服务制定路径(路径为虚拟机配置文件位置)scp zabbix.xml 10.10.7.1…

实验11-使用keras完成逻辑回归

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6 运行结果: 代码:import numpy as npfrom keras.models import Sequential from keras.layers import Dense, Dropout, Activation, Flatten import matplotlib.pyplot as plt from sklearn import datasets# 样本数据集…

【工具-PyCharm】

工具-PyCharm ■ PyCharm-简介■ PyCharm-安装■ PyCharm-使用■ 修改主题■ 设置字体■ 代码模板■ 解释器配置■ 文件默认编码■ 快捷键■ 折叠■ 移动■ 注释■ 编辑■ 删除■ 查看■ 缩进■ 替换 ■ PyCharm-简介 官方下载地址 Professional&#xff1a;专业版&#xff0…

Linux KASAN使用与实现原理

一、KASAN工具使用 KASAN工具&#xff1a;Kernel Address SANitizer(KASAN)是一种动态内存安全错误检测工具&#xff0c;主要功能是检查内存越界访问和使用已释放内存的问题。 1.1 KASAN宏控开关 KASAN有三种模式&#xff1a;1.通用KASAN&#xff1b;2.基于软件标签的KASAN&…

实验8-1tensorboard可视化+实验8-2tensorboard案例

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6 实验8-1tensorboard可视化运行结果:代码:import tensorflow as tf# 创建默认图 graph = tf.compat.v1.get_default_graph()# 定义命名空间 with graph.as_default():with tf.name_scope(input):# fetch:就是同时运行多…

科技论文网站:中国科技论文在线

文章目录 1. Intro2. Main3. Cons Evaluation彩蛋&#xff1a;科学素质 这是作者最后一次发 这种类型的宣传 科普文章 1. Intro 中国科技论文在线是经教育部批准&#xff0c;由教育部科技发展中心主办&#xff0c; 利用现代信息技术手段&#xff0c;打破传统出版物的概念&…

虚方法

若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法。虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的(以后再讲)虚方法的特点:虚方法前不允许有static,abstract,或override修饰符虚方法不能是私有的,因此不能…

【Vue】如何使用Webpack实现打包操作

一、Webpack介绍 Webpack最主要的作用就是打包操作&#xff0c;由两个核心部分构成分别是“出口”与“入口”。wbepack是现在比较热门的打包工具了&#xff0c;它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。说的直白一点&#xff0c;通过webpac…

RPC(远程过程调用)详解

一、RPC是什么 RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。 二、RPC需要解决的问题 1、Call ID映射 我们怎么告诉远…