第九周-八皇后问题

数据结构与算法 — 八皇后问题(回溯算法) 问题描述 在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 假设上图中红点为一个皇后的位置,那么他的同行,列,斜线上都不能再放置其他皇后(也就是红线覆盖的位置) 此图为八皇后问题的其中一种解法,目前已经有人用图论的方法解出92种结果。 思路分析 一、如何实现 这就和我们人做这种题的时候一样,所有放置皇后的过程都是一行一行来的,首先将第一行的皇后放在第一个位置,然后再看第二行。最开始也是将第二行的皇后放在第二行的第一个位置,发现冲突 阅读详情


每一行可以而且必须放一个皇后,所以n皇后问题的解可以用一个n元向量X=(x1,x2,.....xn)表示,其中,1≤ i≤ n且1≤ xi≤ n,即第n个皇后放在第i行第xi列上。
由于两个皇后不能放在同一列上,所以,解向量X必须满足的约束条件为:

xi≠ xj;
若两个皇后的摆放位置分别是(i,xi)和(j,xj),在棋盘上斜率为-1的斜线上,满足条件i-j=xi-xj;在棋盘上斜率为1的斜线上,满足条件i+j=xi+xj;
综合两种情况,由于两个皇后不能位于同一斜线上,所以,解向量X必须满足的约束条件为:
|i-xi|≠ |j-xj|

public class Demo {
	static int row;
	static int column;
	static int[] queen = new int[100];
	static char[][] a = new char[100][100];

	static boolean judge(int k)// 判断皇后k放在x[k]列是否发生冲突
	{
		int i;
		for (i = 1; i < k; i++)
			if (queen[k] == queen[i] || Math.abs(k - i) == Math.abs(queen[k] - queen[i])) {
				return false;
			}
		return true;
	}

	public static void mothed(int n) {
		int i, k;
		for (i = 1; i <= n; i++)
			queen[i] = 0;
		k = 1;
		queen[1] = (int) (Math.random() * 8);// 随机第一列的皇后
		while (k >= 1) {
			queen[k] = queen[k] + 1; // 在下一列放置第k个皇后
			while (queen[k] <= n && !judge(k)) {
				queen[k] = queen[k] + 1;// 搜索下一列
			}
			if (queen[k] <= n && k == n){ // 得到一个输出
				return;
			} else if (queen[k] <= n && k < n){
				k = k + 1;// 放置下一个皇后
			}
			else {
				queen[k] = 0;// 重置x[k],进行回溯
				k = k - 1;
			}
		}
	}

	public static void show(int n) {
		int row, column;
		int i;
		for (i=1;i<=n;i++){
			for (int j=0;j<=n;j++)
				a[i][j]=' ';
		}//简单初始化
		for (row = 1, i = 1; row <= n; row++, i++) {
			a[row][queen[i]] = 'Q';
		}
		for (row = 1; row <= n; row++) {
			for (column = 1; column <= n; column++) {
				System.out.print("|"+a[column][row]);
			}
			System.out.println("|");
		}
	}// 输出皇后矩阵

	public static void main(String[] args) {
		int n = 8;
		mothed(n);
		show(n);
	}

}

显示结果:



同理,只需要稍微更改一下源代码,使mothed(int n)函数进行递归。
public class Demo {
	static int temp_0, temp_1, temp_2;
    static int count=0;
	static int[] queen = new int[100];
	static int[][] a = new int[100][100];

	static boolean judge(int k)// 判断皇后k放在x[k]列是否发生冲突
	{
		int i;
		for (i = 1; i < k; i++)
			if (queen[k] == queen[i] || Math.abs(k - i) == Math.abs(queen[k] - queen[i])) {
				return false;
			}
		return true;
	}

	public static void mothed(int n) {
		int i, k;
		for (i = 1; i <= n; i++)
			queen[i] = 0;
		k = 1;
		while (k >= 1) {
			queen[k] = queen[k] + 1; // 在下一列放置第k个皇后
			while (queen[k] <= n && !judge(k)) {
				queen[k] = queen[k] + 1;// 搜索下一列
			}
			if (queen[k] <= n && k == n){ // 得到一个输出
				for (i=1;i<=n;i++){
					System.out.print(queen[i]+" ");
				}
				count++;
				System.out.println("");
			} else if (queen[k] <= n && k < n){
				k = k + 1;// 放置下一个皇后
			}
			else {
				queen[k] = 0;// 重置x[k],进行回溯
				k = k - 1;
			}
		}
	}

	public static void show(int n) {
		int row, column;
		int i;
		for (row = 1, i = 1; row <= n; row++, i++) {
			a[row][queen[i]] = 1;
		}
		for (row = 1; row <= n; row++) {
			for (column = 1; column <= n; column++) {
				System.out.print(a[column][row] + " ");
			}
			System.out.println("");
		}
	}// 输出皇后矩阵

	public static void main(String[] args) {
		int n = 8;
		mothed(n);
		//show(n);
		System.out.println("共"+count+"解决方案。");
	}

}

结果:
1 5 8 6 3 7 2 4 
1 6 8 3 7 4 2 5 
1 7 4 6 8 2 5 3 
1 7 5 8 2 4 6 3 
2 4 6 8 3 1 7 5 
2 5 7 1 3 8 6 4 
2 5 7 4 1 8 6 3 
2 6 1 7 4 8 3 5 
2 6 8 3 1 4 7 5 
2 7 3 6 8 5 1 4 
2 7 5 8 1 4 6 3 
2 8 6 1 3 5 7 4 
3 1 7 5 8 2 4 6 
3 5 2 8 1 7 4 6 
3 5 2 8 6 4 7 1 
3 5 7 1 4 2 8 6 
3 5 8 4 1 7 2 6 
3 6 2 5 8 1 7 4 
3 6 2 7 1 4 8 5 
3 6 2 7 5 1 8 4 
3 6 4 1 8 5 7 2 
3 6 4 2 8 5 7 1 
3 6 8 1 4 7 5 2 
3 6 8 1 5 7 2 4 
3 6 8 2 4 1 7 5 
3 7 2 8 5 1 4 6 
3 7 2 8 6 4 1 5 
3 8 4 7 1 6 2 5 
4 1 5 8 2 7 3 6 
4 1 5 8 6 3 7 2 
4 2 5 8 6 1 3 7 
4 2 7 3 6 8 1 5 
4 2 7 3 6 8 5 1 
4 2 7 5 1 8 6 3 
4 2 8 5 7 1 3 6 
4 2 8 6 1 3 5 7 
4 6 1 5 2 8 3 7 
4 6 8 2 7 1 3 5 
4 6 8 3 1 7 5 2 
4 7 1 8 5 2 6 3 
4 7 3 8 2 5 1 6 
4 7 5 2 6 1 3 8 
4 7 5 3 1 6 8 2 
4 8 1 3 6 2 7 5 
4 8 1 5 7 2 6 3 
4 8 5 3 1 7 2 6 
5 1 4 6 8 2 7 3 
5 1 8 4 2 7 3 6 
5 1 8 6 3 7 2 4 
5 2 4 6 8 3 1 7 
5 2 4 7 3 8 6 1 
5 2 6 1 7 4 8 3 
5 2 8 1 4 7 3 6 
5 3 1 6 8 2 4 7 
5 3 1 7 2 8 6 4 
5 3 8 4 7 1 6 2 
5 7 1 3 8 6 4 2 
5 7 1 4 2 8 6 3 
5 7 2 4 8 1 3 6 
5 7 2 6 3 1 4 8 
5 7 2 6 3 1 8 4 
5 7 4 1 3 8 6 2 
5 8 4 1 3 6 2 7 
5 8 4 1 7 2 6 3 
6 1 5 2 8 3 7 4 
6 2 7 1 3 5 8 4 
6 2 7 1 4 8 5 3 
6 3 1 7 5 8 2 4 
6 3 1 8 4 2 7 5 
6 3 1 8 5 2 4 7 
6 3 5 7 1 4 2 8 
6 3 5 8 1 4 2 7 
6 3 7 2 4 8 1 5 
6 3 7 2 8 5 1 4 
6 3 7 4 1 8 2 5 
6 4 1 5 8 2 7 3 
6 4 2 8 5 7 1 3 
6 4 7 1 3 5 2 8 
6 4 7 1 8 2 5 3 
6 8 2 4 1 7 5 3 
7 1 3 8 6 4 2 5 
7 2 4 1 8 5 3 6 
7 2 6 3 1 4 8 5 
7 3 1 6 8 5 2 4 
7 3 8 2 5 1 6 4 
7 4 2 5 8 1 3 6 
7 4 2 8 6 1 3 5 
7 5 3 1 6 8 2 4 
8 2 4 1 7 5 3 6 
8 2 5 3 1 7 4 6 
8 3 1 6 2 5 7 4 
8 4 1 3 6 2 7 5 
共92解决方案。



算法分析——第九周(回溯法) 回溯算法 理论依据: 多米诺性质 典型实例 八皇后问题: int flag[8]//标志数组,下标代表列数,值代表行数 伪代码: for j=1 to 8:   if flag[j]==0:     if 处于同一对角线     then 不做处理     else flag[j]=i; 时间复杂度:O(n^n)其实我也不是很清楚 0-1背包问题 getValue(index,value,we... 阅读详情

相关推荐

八皇后问题:在8x8的棋盘上,其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线

八皇后问题:设8皇后问题的解为 (x1, x2, x3, …,x8), 约束条件为:在8x8的棋盘上,其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。要求用一位数组进行存储,输出所有可能的排列。

八皇后问题:

思路:转自:八皇后 显然,每一行可以而且必须放一个皇后,所以n皇后问题的解可以用一个n元向量X=(x1,x2,…..xn)表示,其中,1≤ i≤ n且1≤ xi≤ n,即第n个皇后放在第i行第xi列上。由于两个皇后不能放在同一列上,所以,解向量X必须满足的约束条件为:xi≠ xj;若两个皇后的摆放位置分别是(i,xi)和(j,xj),在棋盘上斜率为-1的斜线上,满足条件i-j=xi-xj;在棋盘

wosiguwozai0133的博客 417

告别电机啸叫!手把手教你配置TMC5160的StealthChop2静音模式(附参数自整定避坑指南)

本文详细介绍了如何通过配置TMC5160的StealthChop2模式彻底消除3D打印机电机噪音。从硬件准备到参数自整定,再到高级调优与异常处理,手把手教你实现实验室级别的静音效果,提升打印质量和使用体验。

weixin_33724659的博客 487

n皇后问题(回溯法)

回溯法求解n皇后问题Queue(皇后k摆放在k行x[k]列的位置) 算法如下 输入:皇后的个数n 输出:n皇后问题的所有可行解 1.  初始化解向量x[n]={-1} 2.  K=0; 3.  While(k>=0) 3.1     把皇后k摆放在下一列的位置,即x[k]++; 3.2     从x[k]开始依次考察每一列,如果皇后k摆放在x[k]位置不发生冲突,则转步骤3.3

j2013210855的专栏 1000

半导体领域知识 - 初级入门

半导体领域知识 - 初级入门 知识问答 1. 一个晶圆上根据芯片的大小,可以生产几百、几千、几万个芯片。如下图: 2. 8寸晶圆指的是什么?5nm工艺指的是什么? 8寸晶圆指的是直径为175mm(17.5cm)的晶圆,下面是6/812/18寸晶圆的尺寸以及相关发展历程。目前拥有12寸线的厂商只有5家,一个12寸晶圆厂的成本需要上百亿美金。 5nm工艺指的是在一个具体的芯片上,有很多微型结构(千万、亿级别的晶体管),这些核心基本单元MOS管的栅极宽度尺寸来衡量工艺的精细程度,如果是5nm就被称为5nm工艺

Hello World! 2万+

【通信协议-RTCM】MSM语句(1) - 多信号GNSS观测数据消息格式

注释:RTCM响应消息1020为GLONASS星历信息,暂不介绍,前公司暂未研发RTCM消息类型版本的DR/RTK模块,DR/RTK模块仅NMEA消息类型使用注释:公司使用的多信号语句类型为MSM4&MSM7,也应该是运用最广泛的语句类型,例如本人之前在公司开发的工具全是基于MSM7语句类型来进行的。

qxj2422640226的博客 2093

回溯法经典例题(五):java解n皇后问题

package nQueensProblem; import java.util.Scanner; public class NQP { static int n;//皇后个数 static int[] x;//当前解;x[i]表示第i行的皇后i所处的列号 static int sum;//可行解个数 public static int nqueens(int nn) { n=nn; x=new int[n+1]; for(int i=0;i<=n;i++) x[i]=0; s

sc2333的博客 1362

从零到一:如何用YOLOv8和PyQt5打造你的第一个花卉识别桌面应用

本文详细介绍了如何使用YOLOv8和PyQt5从零开始构建一个花卉识别桌面应用。涵盖环境搭建、数据准备、模型训练、界面设计、模型集成与性能优化等全流程,帮助开发者快速掌握深度学习目标识别技术的实际应用。

weixin_29048775的博客 454

回溯算法之n皇后问题

今天在看深度优先算法的时候,联想到DFS本质不就是一个递归回溯算法问题,只不过它是应用在图论上的。OK,写下这篇博文也是为了回顾一下回溯算法设计吧。 学习回溯算法问题,最为经典的问题我想应该就是八皇后问题了。 一、适用范围   回溯算法应用的范围当然是很多了,那么归纳一下:如果一个问题中,没有很好的数学模型来解决,或者有数学模型解决,但是很难实现,那么我们就可以使用回溯算法来求解。 二、定...

weixin_30823833的博客 235

从编解码芯片看Tesla T4的隐藏实力:双NVDEC如何实现70路1080P解码?

本文深入剖析了英伟达Tesla T4显卡的隐藏实力,重点解读其独特的双NVDEC硬件解码器设计如何突破性能瓶颈。通过分析Turing架构、对比HEVC/H.264解码差异,并结合驱动与SDK优化,揭示了实现高达70路1080P视频流并发解码的原理与实战配置,为云游戏、直播转码等高并发场景提供高效解决方案。

weixin_29209801的博客 485

ESP32与DS18B20温度传感器的数据采集与告警系统

并且,通过自定义的微信告警功能,我们可以及时收到温度超过阈值的告警消息。随着物联网的快速发展,传感器在各种应用场景中发挥着重要的作用。本文将介绍如何使用ESP32微控制器与DS18B20温度传感器结合,通过串口输出和Web服务器实现温度数据的采集和监控,并使用自定义微信告警功能。上传完成后,打开串口监视器,您将看到ESP32连接到Wi-Fi网络,并开始监测温度。在您的计算机或移动设备上,打开一个Web浏览器,并输入ESP32的IP地址。在浏览器中输入ESP32的IP地址后,您将看到显示当前温度的页面。

loop_class349的博客 2246

八皇后问题详解(深度优先搜索)C++

dfs解决八皇后问题

Charles_Beiming的博客 4436

《【一看就会】Autoware.universe的“规划”部分源码梳理》系列文章目录(持续更新中)

第零章:Planning综述 第一章:【一】全局路径生成模块——mission_planner 第二章:【二】路径行为规划模块——behavior_path_planner第一部分——behavior_path_planner模块 第三章:【二】路径行为规划模块——behavior_path_planner第二部分——behavior_path_planner_common模块(1) 第四章:【二】路径行为规划模块——behavior_path_planner第三部分——behavior_path_plan

weixin_48386130的博客 2339

八皇后问题python_八皇后问题Python实现

八皇后问题描述问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式。首先,我们想到递归和非递归两类算法来解决这个问题。首先说说递归地算法。很自然的,我们可以基于行来做判断标准。八...

weixin_39641697的博客 1001

猿创征文|Qt 文件和目录应用讲解【QCoreApplication】【QFile、QFileInfo】【QTemporaryDir和QTemporaryFile】【QDir】【QFileSyste】

Qt 文件和目录精准讲解【QCoreApplication】【QFile、QFileInfo】【QTemporaryDir和QTemporaryFile】【QDir】【QFileSyste】【QFileDialog】 第一章 QCoreApplication类 第一节 QCoreApplication常用函数方法 第二节 QCoreApplication举例 第二章 QFile类 第一节 静态函数方法 第二节 成员函数方法 第三章 QFileInfo类 第一节 常用函数方法 第四章 QDir类

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 942

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

八皇后问题python_【算法】八皇后问题 Python实现

【八皇后问题】问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式。■  描述 & 实现之前的Python基础那本书上介绍递归和生成器的一张有解过这个问题。书本中对于此问...

weixin_39635314的博客 649

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

数据结构与算法之八皇后问题

八皇后问题八皇后问题介绍思路分析代码图文解析特别感谢 韩顺平 老师的教导 八皇后问题介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋手马克思.贝瑟尔与1848年提出: 在8x8格的国际象棋上摆放八个皇后,使其不能相互攻击,即: 任意两个皇后都不能处于同一行,同一列或同一斜线上,问有多少种摆法 思路分析 第一个皇后先放第一行第一列 第二个皇后放在第二行第一列,然后...

Happy_Boy_z的博客 3027

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++:八皇后问题

大体思路 首先定义一个8*8的二维矩阵,所有的元素都为0,然后开始调用回溯函数寻找皇后。 BackTrack函数是一个回溯函数,回溯的终止条件为计数变量n为8,即皇后放到了最后一行。如果n不等于8,则循环放尝试每一列,如果可以放则将这个位置标记为1,然后继续向下一行查找,直到找完所有8行。 找完后回溯依次往回跳出,并把之前找的皇后记录消除抹掉,即将其再次赋值为0,然后再寻找下一位置。 Judge判...

SongXJ的博客 1417

python八皇后问题递归算法_Python实现八皇后问题示例代码

八皇后问题描述问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式。首先,我们想到递归和非递归两类算法来解决这个问题。首先说说递归地算法。很自然的,我们可以基于行来做判断标准。八...

weixin_39640845的博客 352

八皇后问题

八皇后问题解法~

xRENx_的博客 692

OpenJudge-2.5基本算法之搜索-1700八皇后问题题解

这是OpenJudge-2.5基本算法之搜索-1700八皇后问题的题解,使用递归算法

bt1JSAXX的博客 1449

Java数据结构算法之八皇后问题

八皇后问题是由国际象棋手马克斯-贝瑟于1848年提出的问题,是回溯算法的经典案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。答案是92种,一维数组和二维数组都可以用来解决该问题,在这里使用一维数组模拟解决该问题,其中一维数组有八个元素,每个元素的位置标号代表第几行,而每个元素的值代表是在该行的第几列。例如:0 6 4 7 1 3 5 2 就代表八个皇后被摆放在(0,0),(1,6),(2,4),(3,7),(4,1)

qq_41956078的博客 783

【数据结构17】递归--八皇后问题

文章目录1. 八皇后问题2. 八皇后问题分析3. 代码实现 1. 八皇后问题 2. 八皇后问题分析 3. 代码实现 public class Queue8 { //定义一个max,表示共有对少个皇后 int max = 8; //定义数组array,保存皇后放置位置的结果 int[] arr = new int[max]; static int coun...

你今天真好看呀 404

八皇后问题Python实现

八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子。在一个棋盘上如果要放八个皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步的,所有)布局方式。 首先,我们想到递归和非递归两类算法来解决这个问题。首先说说递归地算法。   很自然的,我们...

dengqiao4780的博客 331

递归算法之“八皇后问题”

一、八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 下面的图片为八皇后问题的一种解法: 二、实现 在编写这个程序之前,我们先来思考几个问题: 1.棋盘怎么表达? 答:用二维数组来表示,并且,1表示有皇后,0表示无皇后。 2.如何判断当前位置(行、列)是安全的? 答:分...

weixin_44047196的博客 545
上一篇: 解决Gravatar头像被墙问题
下一篇: 制作一个简单的Native App-利用“添加到主屏幕”
Hades_Dev
博客等级 码龄14年 542粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值