Java数据结构(9)----八皇后问题(回溯)

本文深入探讨了经典的八皇后问题,详细介绍了如何使用回溯算法在8×8的棋盘上放置八个皇后,确保它们不在同一行、列或斜线上。通过逐步分析和代码示例,展示了算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

八皇后回溯算法

由来

1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。

思路

先谈谈思路
1.将第一个皇后放在第一行第一列上
2.将第二个皇后放在第一行第一列上,发现与第一个处在同一列,不符合,遂将第二个皇后放在第二行第二列,发同一斜线,遂将其放在第二行第三列上。
3.将第三个皇后,还是第三行的第一列,第二列········到第8个列一个一个试,发现不冲突则将其放在应该的位置。
4.第四个,五个,六个,七个,八个,都是如此,直到八个位置都是正确解。
5.打个比方 当发现第六个皇后在第六行的每列都不符合要求,则开始回溯,回到第五列的那个位置,将皇后往后移一列,再检查是否符合规则,再开始后续其他皇后的放置。
图示:
在这里插入图片描述

代码:放置皇后

//放置第n个皇后
		//check 是 每一次递归时,进入到check中都有  for(int i = 0; i < max; i++),因
		//此会有回溯
		private void check(int n) {
			if(n == max) { 
				print();
				return;
			}
			
			//依次放入皇后,并判断是否冲突
			for(int i = 0; i < max; i++) {
				//先把当前这个皇后 n , 放到该行的第1列
				array[n] = i;
				//判断当放置第n个皇后到i列时,是否冲突
				if(judge(n)) { // 不冲突
					//接着放n+1个皇后,即开始递归
					check(n+1); //  
				}
				//如果冲突,就继续执行 array[n] = i; 即将第n个皇后,放置在本行得 后移的一个位置
			}
		}

判断皇后是否冲突

private boolean judge(int n) {
			judgeCount++;
			for(int i = 0; i < n; i++) {			
				if(array[i] == array[n] || Math.abs(n-i) == Math.abs(array[n] - array[i]) ) {
					return false;
				}
			}
			return true;
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼爱吃柚子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值