用全排列的方法解决八皇后问题

本文通过PHP编程语言实现了八皇后问题的求解过程。利用数组的全排列来寻找所有可能的解决方案,并通过逐行逐列的冲突判断筛选出符合条件的棋盘布局。

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

用百度搜索八皇后问题,几乎清一色都是用回溯,有兴趣的同学可参考:从全排列和八皇后问题谈回溯

解决一个问题,我们应该充分利用已有的条件,化繁为简。

$a=[0,1,2,3,4,5,6,7];

可以看到,这个数组的下标刚好也是0到7——对应着八皇后棋盘的0行到7行。而数组的这八个各不相同值,则对应八皇后棋盘的0到7列——所有满足八皇后的排列,都应当是这8个数字全排列的子集!

因此,我们首先求出所有的排列。

<?php
$a=[0,1,2,3,4,5,6,7];
function f($a,$str=''){
	if(count($a)==1){
		$_GET[]=$str.$a[0];
		return ;
	}
	for($i=0;$i<count($a);$i++){
		list($a[0],$a[$i])=[$a[$i],$a[0]];
		f(array_slice($a,1),$str.$a[0]);
	}
}
f($a); 
接着,找出满足八皇后约束条件的字排列即可。

foreach($_GET as $n){
	$bool=true;
	for($i=7;$i>=1;$i--){
		if(!$bool){
			break;
		}	
		for($j=$i-1;$j>=0;$j--){
			if(abs($n[$i]-$n[$j])==$i-$j){	
				$bool=false;
				break;
			}	
		}
	}
	if($bool){
		$_POST[]=$n;
	}	
} 
print_r($_POST);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值