从全排列和八皇后问题谈回溯

一般来讲,人们常常提及的回溯,通常指走不通就掉头。另一种情况,路走完了,回到开始的地方重新选择另一条路,也可称之为回溯——下面是重点。

几乎所有回溯的写法,都是for循环里嵌套着递归。如果不存在走不通的情况,则无条件递归,否则,就用if判断是回到上一层还是进入下一层,下面用相关代码片段说明。

全排列

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]);
	}
}
可以看到,无条件的递归。

八皇后

function bhh($a=[],$n=0){
	if(count($a)==8){
		$_GET[]=$a;
		print_r($a).' ';
		return;
	}
	for($i=0;$i<8;$i++){
		if($n==0){
			$a[0]=$i;
			bhh($a,$n+1);
		}else{	
			$bool=true;
			foreach($a as $k=>$v){
				if($i==$v or abs($i-$v)==$n-$k){	
					$bool=false;
					break;
				}
			}	
			if($bool){
				$a[$n]=$i;
				bhh($a,$n+1);
			} 
		}	
	} 
}
可以看到,在for里面有相关的条件判断代码——如果不满足,则回到上一层。

关于二者的结合,有兴趣的同学可移步至:用全排列的方法解决八皇后问题



猜你喜欢

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