【使用回溯法求解八皇后问题(92个解)】

news2024/11/24 19:13:50

在每一个横列、竖列、斜列都只有一个皇后
解决的冲突

包括行、列和两条对角线

规定每一行放置一个皇后,不会造成行上的冲突
当第col列被某个皇后占领之后,则同一列上的所有空格都不能再放置皇后,并且要把flag[col]置为被占领状态
对角线有两个方向,当第n行第col列皇后占领之后,要同时把以上下对角线标记置为被占领状态


程序的结构

初始化(清除棋盘)
循环八次
	1 放置一个皇后
	2 检查是否满足条件,如果满足,登记皇后的位置
	3 如果不满足,则退回,增加一步后再放置皇后
直到放到最后一个皇后

函数的定义

generate函数:找到n个皇后适合的位置
(找到第n-1个皇后合适的位置)、(找到第n个皇后合适的位置)
递归的终止条件是:找到最后一个皇后的位置

执行的过程

1、将数据进行初始化
2、从col列开始摆放第n个皇后(因为这样可以符合每一竖列一个皇后的要求),挨个去测试列是否可行,先测试当前位置(n,col)是否安全:
	如果是安全的,那么就去摆放第n个皇后,并且宣布占领(记得要横行竖列斜列一起来)
	如果没有测试完所有的行
		递归测试下一行generate(n+1)
		当n等于7(0-7)的时候,打印结果
	如果当n>=7时,发现此时已经无法摆放或者摆放完毕的时候,就要进行回溯了
3、输出结果

数据结构

place:int数组[0..7];
	第n行皇后所占据的列号
	主要用于输出结果
flag:bool数组[0..7];
	表示col列上是否可以放置皇后
d1:bool数组[0..14];
	(n,col)所在上对角线上是否可以放置皇后
d2:bool数组[0..14];
	(n,col)所在下对角线上是否可以放置皇后

上对角线
在这里插入图片描述

行号减去列号

处理上对角线
在这里插入图片描述

行号减去列号加上7来处理(处理为正数)

下对角线
在这里插入图片描述

行号加上列号

编程思路

1、是否可以放置皇后
2、放置皇后
3、删除皇后(回溯)

在这里插入图片描述

# include <stdio.h>
# include <stdbool.h>

int place[8] = { 0 };	// 保存皇后的位置,下标为行,储存的数据为列。

bool flag[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };	// 用来保存哪一列已经存在皇后 

bool d1[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };	
// 从左上到右下的对角线为上对角线,每条上对角线上的行和列的差是一样的。
bool d2[15] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };	
// 从左下到右下的对角线为下对角线,每条下对角线上的行和列的和是一样的。

int key = 0;					// 统计解的数量

// 函数声明
void QueenVIII(int);			// 八皇后问题
void output(void);				// 输出

// 主函数
int main(void)
{
	QueenVIII(0);
	return 1;
}

// 八皇后问题
void QueenVIII(int n)
{
	for (int i = 0; i < 8; ++i)	// 计算第n行皇后的位置
	{
		if (flag[i] && d1[n-i+7] && d2[n+i])	// 判断第n行第i列的位置是否危险
		{
			//宣布占领状态
			place[n] = i;		// 记录皇后的位置 
			flag[i] = 0;		// 记录第i列已经有皇后了 
			d1[n - i + 7] = 0;	// 记录这条上对角线是危险的 
			d2[n + i] = 0;		// 记录这条下对角线是危险的

			if (n < 7)			// 判断八个皇后放完了没有 
			{
				QueenVIII(n + 1);
			}
			else
			{
				output();		//输出
			}
			// 回溯
			flag[i]= 1;
			d1[n - i + 7] = 1;
			d2[n + i] = 1;
		}
	}
}

// 输出
void output(void)
{
	printf("第%d种解法:\n", ++key);
	for (int i = 0; i < 8; ++i)
	{
		for (int l = 0; l < 8; ++l)
		{
			if (place[i] == l)
			{
				printf("1 ");
			}
			else
			{
				printf("0 ");
			}
		}
		printf("\n");
	}
	printf("\n");
}

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

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

相关文章

【Docker】Docker的通信安全

Docker的通信安全 前言一、Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 二、Docker 存在的安全问题1. Docker 自身漏洞2. Docker 源码问题 三、Docker 架构缺陷与安全机制1. 容器之间的局域网攻击2. DDoS 攻击耗尽资源3. 有漏洞的系统调用4. 共享 root 用户权限 四、…

OBS 迁移--华为云

一、创建迁移i任务 1. 登录管理控制台。 2. 单击管理控制台左上角的 在下拉框中选择区域。 3. 单击“ 服务列表 ”&#xff0c;选择“ 迁移 > 对象存储迁移服务 OMS ”&#xff0c;进入“ 对象存储迁移服务 ”页面。 4. 单击页面右上角“ 创建迁移任务 ”。 5. 仔细阅读…

卡尔曼滤波算法原理及示例

例程:物体做匀速运动每秒运动1m,观测器观测方差为1m

安全学习DAY06_抓包技术-HTTPHTTPS

抓包技术-HTTP&HTTPS HTTP&HTTPS抓包针对Web&APP&小程序&PC应用等 本节目的&#xff1a; 掌握几种抓包工具证书安装操作掌握几种HTTP&HTTPS抓包工具的使用学会Web&#xff0c;APP&#xff0c;小程序&#xff0c;PC应用等抓包了解本节课抓包是针对哪些…

大数据课程C5——ZooKeeper的应用组件

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Zookeeper的Canal消费组件&#xff1b; ⚪ 掌握Zookeeper的Dubbo分布式服务框架&#xff1b; ⚪ 掌握Zookeeper的Metamorphosis消息中间件&#xff1b; ⚪ 掌握Zo…

Docker的安装与部署

Docker 基本概念介绍 通俗理解&#xff1a;镜像是类&#xff0c;容器是对象实例 仓库 应用商店、镜像 下载的应用安装程序、容器 应用程序 镜像(Image) 这里面保存了应用和需要的依赖环境 为什么需要多个镜像&#xff1f;当开发、构建和运行容器化应用程序时&#xff0c;我们…

【Postman】Newman安装与环境配置完整版(内含安装过程中遇到的问题与解决方案)

文章目录 概要Newman安装三步走一、nodejs安装与环境配置1、安装2、环境配置 二、安装newman1、步骤2、问题与解决方案 三、安装newman-reporter-html 概要 Newman&#xff1a;一款基于nodejs开发的可以运行Postman脚本的工具&#xff0c;并且可以生成测试报告。本文介绍了New…

【Linux】信号补充与总结

可重入函数 【分析】 mian函数正在调用insert函数向链表中插入节点。insert函数分为两步&#xff0c;刚刚执行完第一步时此时硬件发生中断&#xff0c;使进程切换到内核。中断处理完毕切换到用户态之前发现有信号未决&#xff0c;于是进入了信号的处理函数&#xff0c;信号的处…

XGBoost实例——皮马印第安人糖尿病预测和特征筛选

利用皮马印第安人糖尿病数据集来预测皮马印第安人的糖尿病&#xff0c;以下是数据集的信息&#xff1a; Pregnancies&#xff1a;怀孕次数Glucose&#xff1a;葡萄糖BloodPressure&#xff1a;血压 (mm Hg)SkinThickness&#xff1a;皮层厚度 (mm)Insulin&#xff1a;胰岛素 2…

硬件——光模块

简介 光模块的作用就是发送端把电信号转换成光信号&#xff0c;通过光纤传送后&#xff0c;接收端再把光信号转换成电信号。 常见光模块 GBIC 说明&#xff1a;已淘汰产品 速率&#xff1a;1Gbps 出现时间&#xff1a;2000年之前 SFP 说明&#xff1a;GBIC的升级 速率&…

Spring依赖注入方式,自动装配及自动装配特征

Spring依赖注入方式 一、setter注入1.1简单类型1.2引用类型&#xff08;基本数据类型与String&#xff09; 二、构造器注入1.1简单类型1.2引用类型&#xff08;基本数据类型与String&#xff09; 三、依赖注入方式选择四、自动装配依赖自动装配特征 总结 一、setter注入 依赖注…

Windows下安装Hadoop(手把手包成功安装)

Windows下安装Hadoop&#xff08;手把手包成功安装&#xff09; Windows下安装Hadoop&#xff08;手把手包成功安装&#xff09;一、环境准备1.1、查看是否安装了java环境 二、下载Hadoop的相关文件三、解压Hadoop安装包四、替换bin文件夹五、配置Hadoop环境变量六、检查环境变…

UWB自组网定位技术助力消防救援、消防训练人员定位调度!

在消防救援领域&#xff0c;保障消防人员的人身安全是头等大事&#xff01;而保障消防人员的生命安全的关键在于确认其在火场中所在的位置&#xff0c;一旦遇险&#xff0c;可以及时通知后台管理人员和现场调度人员&#xff0c;也方便管理人员及时调度周围救火人员及时援手施救…

Oracle 截取指定字符到目标串的末尾

SQL&#xff1a; SELECT-- 目标字符串 目标字符串 指定符号 最后一个 最后一个字符位置1 substr( HG/2106010103/YG\FJSJ\SXKTFJ\FJ03_JPHD, instr( HG/2106010103/YG\FJSJ\SXKTFJ\FJ03_…

嵌入式linux通用spi驱动之spidev使用总结

Linux内核集成了spidev驱动&#xff0c;提供了SPI设备的用户空间API。支持用于半双工通信的read和write访问接口以及用于全双工通信和I/O配置的ioctl接口。使用时&#xff0c;只需将SPI从设备的compatible属性值添加到spidev区动的spidev dt ids[]数组中&#xff0c;即可将该SP…

【后端面经】微服务架构( 1-4) | 降级:为什么马服要关闭所有人聊天?

文章目录 一、 前置知识1、什么是降级?2、降级的典型应用3、为什么要降级?4、降级的分类5、如何降级?A) 降级的应用场景B) 跨服务降级C) 提供有损服务二、面试环节1、面试准备2、基本流程3、亮点方案A) 读写服务降级写服务B) 快慢路径降级慢路径三、章节汇总 在熔断章…

opencv-23 图像几何变换02-翻转-cv2.flip()

在 OpenCV 中&#xff0c;图像的翻转采用函数 cv2.flip()实现 &#xff0c;该函数能够实现图像在水平方向翻转、垂直方向翻转、两个方向同时翻转&#xff0c;其语法结构为&#xff1a; dst cv2.flip( src, flipCode )式中&#xff1a;  dst 代表和原始图像具有同样大小、类…

通过RPM方式安装,升级,卸载,以及配置使用MySQL

通过RPM方式安装&#xff0c;升级&#xff0c;卸载&#xff0c;以及配置使用MySQL 一、下载 MySQL是一种开源的关系数据库管理系统&#xff0c;被广泛应用于各种业务应用中。本文将讲解如何下载和安装MySQL的rpm安装包。下载rmp安装包有多种方式&#xff1a; 1、可以到MySQL的…

【图解CAN总线】-10-详解CANFD的TDC以及SSP(收发器延迟补偿和第二采样点)

目录 1 CAN Transceiver收发器结构 1.1 CAN收发器对本ECU发送CAN报文的“回采” 1.2 什么是Loop delay环路延迟 1.2.1 Loop delay环路延迟的典型值 2 什么是TDC:Transceiver Delay Compensation收发器延迟补偿 2.1 总结&#xff1a;Transceiver Delay Compensation启用条…

【C#】.Net Framework框架使用JWT

2023年&#xff0c;第31周&#xff0c;第2篇文章。给自己一个目标&#xff0c;然后坚持总会有收货&#xff0c;不信你试试&#xff01; 本篇文章主要简单讲讲&#xff0c;.Net Framework框架下使用JWT的代码例子&#xff0c;以及他们的基本概念。 2002年微软发布了.net framewo…