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

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

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

$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);



猜你喜欢

转载自blog.csdn.net/weixin_39009993/article/details/79122317