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

本文介绍了回溯算法的基本概念,并通过全排列与八皇后问题详细展示了无条件递归及有条件回溯的具体实现方式。

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

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

几乎所有回溯的写法,都是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里面有相关的条件判断代码——如果不满足,则回到上一层。

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值