62、回溯-N皇后

server/2024/9/25 21:20:39/

思路:

        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皇后问题可以被系统地解决,所有可能的棋盘配置都会被找到并记录。

java">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.ppmy.cn/server/24887.html

相关文章

2024-04学习笔记

1.sql优化-子查询改为外连接 1.改之前 改之前是这样&#xff0c;那针对查出来的每一条数据&#xff0c;都要执行一次箭头所指的函数 执行的sql很慢 2.改之后 改之后是这样&#xff0c;整体做外连接&#xff0c;不用每一条都再执行一次查询 执行时间缩短了好几倍 2.Mybatis中…

c语言——二叉树

目录 目录 二叉树关键概念理解 一颗拥有1000个结点的树度为4&#xff0c;则它的最小深度是&#xff1f; 那么对于二叉树&#xff0c;只掌握这些是远远不够的&#xff0c;我们还需要掌握几个最基本的经典问题&#xff0c; 求二叉树大小 求叶子结点个数 求深度 求第k层的…

python生成随机验证码图片+噪声

参数&#xff1a;图片宽高、验证码个数&#xff0c;文字大小 def check_code(width90, height30, length4, font_size26):code []from PIL import Image, ImageDrawimg Image.new(modeRGB, size(width, height), color(255, 255, 255))draw ImageDraw.Draw(img, modeRGB)def…

C++信息学奥赛 数据结构认识

数据结构 1.1数据结构分类 1.2基本数据类型 1.3数字编码 1.4字符编码 1.1数据结构分类 数据结构如同一副稳固而多样的框架。为数据的有序组织提供了蓝图&#xff0c;算法得以在此基础上生动起来。 常用的数据结构包括哪些 &#xff0c; &#xff0c; &…

Unity 数字字符串逗号千分位

使用InputField时处理输入的数字型字符串千分位自动添加逗号&#xff0c;且自动保留两位有效数字 输入&#xff1a;123 输出&#xff1a;123.00 输入&#xff1a;12345 输出&#xff1a;12,345.00 代码非常简单 using UnityEngine; using TMPro;public class …

【MyBatis】进阶使用 (动态SQL)

动态SQL \<if>\<trim>\<where>\<set>\<foreach>\<include> 在填写表单时&#xff0c;有些数据是非必填字段&#xff08;例如性别&#xff0c;年龄等字段&#xff09;&#xff0c;那就需要在接收到参数时判断&#xff0c;根据参数具体的情况…

Docker--compose概述与部署

目录 一、概述 1. Compose简介 1.1 docker compose常用命令 1.2 Compose配置常用字段 2. YAML简介 2.1 YAML支持的数据结构 2.2 YML文件编写注意事项 2.3 Docker Compose文件结构 3. Docker-Compose安装 ​编辑 4.docker Compose撰写nginx 镜像 1. 准备环境 ​编辑…

HaLo-NeRF:利用视觉和语言模型对场景的精准定位和细粒度语义理解

包含大量摄影师拍摄的照片的互联网图像集有望实现对大型旅游地标的数字探索。然而&#xff0c;先前的工作主要集中在几何重建和可视化上&#xff0c;忽略了语言在为导航和细粒度理解提供语义界面方面的关键作用。 项目&#xff1a;HaLo-NeRF: Learning Geometry-Guided Semant…