深度优先——八皇后

一、八皇后

描述

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。

给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

格式

输入格式:第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1≤b≤92)。

输出格式:输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

样例

输入样例:

2
1
92

输出样例:

15863724
84136275

(一)问题分析

思想:DFS通过递归地尝试所有可能的放置位置来寻找解决方案。对于每一步,它都会尝试在当前行的每一列放置皇后,并递归地检查下一行。如果成功地在所有行都放置了皇后,就找到了一个解决方案。如果某个放置导致冲突,则回溯到上一步,并尝试其他可能的放置
说明:皇后串的比较是基于整数的比较,这意味着我们可以将皇后串视为一个八位数(每位都是0到7之间的数字),并按照整数的自然顺序进行比较。在这个问题中,由于只有8行和8列,且每行只能放置一个皇后,因此解决方案的数量是有限的(92组解),这使得DFS成为了一个可行的解决方案。

步骤

  1. 初始化
    (1)二维数组vis来标记棋盘上的位置是否已被占用
    (2)数组b来记录每一行皇后放置的列数。
    (3)二维数组a来存储所有找到的解决方案。
    (4)计数器tot来记录找到的解决方案数量。

  2. 递归函数dfs(step)
    (1)step表示当前正在尝试放置皇后的行数。
    (2)如果step超过了8(即已经尝试完所有行),则意味着找到了一个有效的解决方案,将其保存到a数组中,并增加tot计数器。
    (3)否则,对于当前行的每一列(1到8),检查是否可以在该列放置皇后:
          a.递归返回后,撤销当前列的占用标记,以便尝试其他列。
          b.如果没有被占用,标记这些位置为已占用,将当前列数记录到b[step]中,然后递归调用dfs(step + 1)来尝试下一行。
          c.用vis数组检查当前列、当前行所在的主对角线和副对角线是否已被占用。

  3. 位置合理性判断
    (1)列冲突(vis[0][i]
         每一列只能有一个皇后,因此我们需要跟踪哪些列已经被占用。 vis[0][i]表示第i列是否被占用。如果vis[0][i] == 0,则表示第i列是空的,可以放置皇后
    (2)主对角线冲突(vis[1][step - i + 8]
          在一个8x8的棋盘上,主对角线上的元素满足行号和列号之差为常数。例如(1,1)、(2,2)、(3,3)...(8,8)代表最长的从左上至右下的对角线。若行号和列号之差相同的位置上,均放置皇后会导致主对角线冲突。这里加8是为了避免为负数的情况
    (3)副对角线冲突(vis[2][step + i]
          在一个8x8的棋盘上,副对角线上的元素满足行号和列号之和为常数。例如(1,8)、(2,7)、(3,6)...(8,1)代表最长的从右上至左下的对角线。若行号和列号之和相同的位置上,均放置皇后会导致副对角线冲突。

(二)代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define N 100
using namespace std;int a[N][N], b[N];
int vis[N][N]; // 二维数组,用于标记访问状态
int tot; // 用于记录找到的有效路径数量// 深度优先搜索函数
void dfs(int step) {if (step == 9) { // 当step达到9时,表示已经找到了一个有效的路径tot++; // 有效路径数量加一for (int i = 1; i <= 8; i++) {a[tot][i] = b[i]; // 将当前路径记录到数组a中}return;}for (int i = 1; i <= 8; i++) { // 尝试每一步的8种可能(// 检查是否满足条件 if (vis[0][i] == 0 && vis[1][step + i] == 0 && vis[2][step - i + 8] == 0) {// 标记当前选择为已访问vis[0][i] = 1;vis[1][step + i] = 1;vis[2][step - i + 8] = 1;// 记录当前步的选择b[step] = i;// 递归调用dfs函数,进行下一步的选择dfs(step + 1);// 回溯,撤销当前选择vis[0][i] = 0;vis[1][step + i] = 0;vis[2][step - i + 8] = 0;}}
}int main() {int n;cin >> n; // 输入需要查询的路径数量dfs(1); // 从第一步开始深度优先搜索while (n--) { // 对每一条需要查询的路径int i;cin >> i; // 输入要查询的路径编号for (int j = 1; j <= 8; j++) { // 输出该路径的每一步选择cout << a[i][j];}cout << endl; // 输出换行符}return 0;
}

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

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

相关文章

DApp开发前端框架选择:React还是Vue?

在区块链DApp开发中&#xff0c;前端框架的选择对用户体验和开发效率至关重要。React和Vue作为两大主流前端框架&#xff0c;各自拥有广泛的开发者基础和丰富的生态支持。那么在DApp开发中&#xff0c;该如何选择适合自己的框架呢&#xff1f;下面我们来比较一下&#xff0c;看…

证明网络中的流形成一个凸集

证明网络中的流形成一个凸集 步骤1&#xff1a;定义和符号步骤2&#xff1a;线性组合步骤3&#xff1a;验证容量限制步骤4&#xff1a;验证流量守恒结论示例代码&#xff08;C语言&#xff09; 在网络流理论中&#xff0c;一个流 f f f 是定义在网络图的边集上的一种函数&…

opencv复习

目录 1.core 1.图像变换 1.1 affine仿射变换 1.2 透视变换 2.四元数&#xff08;旋转&#xff09; 2.1 轴角转四元数 2.2 旋转矩阵转四元数 2.3 欧拉角转旋转矩阵 2.4 四元数转旋转矩阵 2.5 四元数用eigen用的比较多 2. imgproc. Image Processing 2.1 bilateralF…

分治_归并_归并排序(逆序对)

912. 排序数组 上一次我们做这道题时用的是数组划分三块的思想搭配随机选择基准元素的⽅法。 随机选择一个数&#xff0c;以这个数key为基准划分数组&#xff0c;小于key的数在左边&#xff0c;大于key的数在右边。再把被划分的两部份再找key值划分&#xff0c;直到只剩1或者0个…

环境兼容: Vue3+ELement-plus

题目&#xff1a;环境兼容&#xff1a; Vue3ELement-plus 前言 身为小白的我也在负责一个项目咯&#xff0c;开发的是Vue3项目&#xff0c;然后就搜阅多篇文章&#xff0c;整理了这个。内容很多是转载的&#xff0c;拼成的我这个文章。 Element-plus简介 Element-plus 是基于…

UE5基本数据类型

bool: 表示布尔值&#xff0c;只有两个取值&#xff1a;true 或 false&#xff0c;用于表示逻辑条件。int8: 表示 8 位的有符号整数&#xff0c;范围是 −128−128 到 127127。uint8: 表示 8 位的无符号整数&#xff0c;范围是 00 到 255255。int16: 表示 16 位的有符号整数&am…

【SpringMVC】参数传递 重定向与转发 REST风格

文章目录 参数传递重定向与转发REST风格 参数传递 ModelAndView&#xff1a;包含视图信息和模型数据信息 public ModelAndView index1(){// 返回页面ModelAndView modelAndView new ModelAndView("视图名");// 或// ModelAndView modelAndView new ModelAndView(…

软件工程 概述

软件 不仅仅是一个程序代码。程序是一个可执行的代码&#xff0c;它提供了一些计算的目的。 软件被认为是集合可执行的程序代码&#xff0c;相关库和文档的软件。当满足一个特定的要求&#xff0c;就被称为软件产品。 工程 是所有有关开发的产品&#xff0c;使用良好定义的&…

【数字化】华为企业数字化转型-认知篇

导读&#xff1a;企业数字化转型的必要性在于&#xff0c;它能够帮助企业适应数字化时代的需求&#xff0c;提升运营效率&#xff0c;创新业务模式&#xff0c;增强客户互动&#xff0c;从而在激烈的市场竞争中保持领先地位并实现可持续发展。通过学习华为企业数字化转型相关理…

Android学习15--charger

1 概述 最近正好在做关机充电这个&#xff0c;就详细看看吧。还是本着保密的原则&#xff0c;项目里的代码也不能直接用&#xff0c;这里就用的Github的。https://github.com/aosp-mirror 具体位置是&#xff1a;https://github.com/aosp-mirror/platform_system_core/tree/mai…

Leetcode刷题(81~90)

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可以啦…

ARINC 标准全解析:航空电子领域多系列标准的核心内容、应用与重要意义

ARINC标准概述 ARINC标准是航空电子领域一系列重要的标准规范&#xff0c;由航空电子工程委员会&#xff08;AEEC&#xff09;编制&#xff0c;众多航空公司等参与支持。这些标准涵盖了从飞机设备安装、数据传输到航空电子设备功能等众多方面&#xff0c;确保航空电子系统的兼…

【数据库】关系代数和SQL语句

一 对于教学数据库的三个基本表 学生S(S#,SNAME,AGE,SEX) 学习SC(S#,C#,GRADE) 课程(C#,CNAME,TEACHER) &#xff08;1&#xff09;试用关系代数表达式和SQL语句表示&#xff1a;检索WANG同学不学的课程号 select C# from C where C# not in(select C# from SCwhere S# in…

学习记录:js算法(一百一十八):连接所有点的最小费用

文章目录 连接所有点的最小费用思路一 连接所有点的最小费用 给你一个points 数组&#xff0c;表示 2D 平面上的一些点&#xff0c;其中 points[i] [xi, yi] 。 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 &#xff1a;|xi - xj| |yi - yj| &#xff0c;其…

Java项目实战II基于微信小程序的小区租拼车管理信息系统 (开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着城市化进程的加速&#xff0c;小区居民对于出行方…

数据结构与算法之美:单链表

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《数据结构与算法之美》、《编程之路》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 目录 …

样品前处理工作站自动化操作

样品前处理工作站通过集成多种技术和自动化模块&#xff0c;实现了对样品的高效、精准处理。以下是实现自动化操作的关键步骤和原理&#xff1a; 1、集成多种技术&#xff1a;工作站通常集成了液体处理、固相萃取、离心、过滤等多种技术。这些技术的结合使得工作站能够完成从样…

redis安装和使用教程【保姆级】

1.下载 通过网盘分享的文件&#xff1a;redis 链接: https://pan.baidu.com/s/1Tu1KZkf33YJFdul8s6SzqQ?pwd8888 提取码: 8888 2.启动 进入根目录&#xff0c;使用redis-server redis.windows.conf命令启行启动Redis服务&#xff0c; 如下图所示为启动成功&#xff0c;默认…

RabbitMq 基础

文章目录 一、初识 MQ1.1 同步调用&#xff1a;1.2 异步调用&#xff1a; 二、RabbitMQ三、SpringAMQP3.1 依赖和配置文件3.2 消息发送和接收&#xff1a;3.2.1 消息发送&#xff1a;3.2.2 消息接收&#xff1a; 3.3 WorkQueues 模型&#xff1a;3.4 交换机类型&#xff1a;3.4…

建筑行业数据分析如何做?

导读&#xff1a;在谈数字化转型之前&#xff0c;先来谈谈数据的价值。数字化转型的基础是数据&#xff0c;是数字化的基本的生产资料&#xff0c;数据的质量直接决定了数字化的能力、所能达到的深度和广度。目前做的数据可视化项目总感觉只是数据展现而已&#xff0c;而不达不…