用百度搜索八皇后问题,几乎清一色都是用回溯,有兴趣的同学可参考:从全排列和八皇后问题谈回溯。
解决一个问题,我们应该充分利用已有的条件,化繁为简。
$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);