当前位置 : 主页 > 网络编程 > PHP >

递归穷举,388水桶,3空88满,平分4444

来源:互联网 收集:自由互联 发布时间:2021-06-28
388水桶,3空88满,平分4444 ";print_r($list);echo " ";function dao($a){global $list,$max;$dao=array();$k=1;//可操作的量,前三位for ($i=0; $i 3 ; $i++) { if ($a[$i]==0) {//当前位为0不可操作}else{//当前位可操作的情
388水桶,3空88满,平分4444
 ";print_r($list);echo "
";

function dao($a){
	global $list,$max;
	$dao=array();
	$k=1;
	//可操作的量,前三位
	for ($i=0; $i <3 ; $i++) { 
		if ($a[$i]==0) {
			//当前位为0不可操作
		}else{
			//当前位可操作的情况下,可被操作的量,全部7位
			for ($j=0; $j <7 ; $j++) { 
				if ($i==$j) {
					//s1.同位不可操作
				}else{
					//可操作的两种情况↓
					//①目标为前三位,可以减的值为被操作位最大值-当前值
					if ($j<3) {
						//可以减的值
						$cha=$max[$j]-$a[$j];
						//值大于0可以减
						if ($cha>0) {
							if ($cha>$a[$i]) {
								$cha=$a[$i];
							}
							//下次循环依旧用到a,不可直接操作a
							$temp=$a;
							$temp[$i]=$temp[$i]-$cha;
							$temp[$j]=$temp[$j]+$cha;
							//操作结果$temp不可为已存在值,排除s3死循环
							if (strpos($list,'|'.$temp)===false) {
								//完成操作,记录,输出,再递归操作
								$list=$list.'|'.$temp;
								//echo $temp.'|'.$i.$j.'';
								$dao[$k]['value']=$temp;
								$dao[$k]['child']=dao($temp);
								$k=$k+1;
							}
						}
					}else{
						//②目标为后四位,当前值小于4-后四位值是可以减为0,加到后4位
						if ($a[$i]<=$max[$j]-$a[$j]) {
							$temp=$a;
							$temp[$j]=$temp[$j]+$temp[$i];
							$temp[$i]=0;
							//操作结果$temp不可为已存在值,排除s3死循环
							if (strpos($list,'|'.$temp)===false) {
								//完成操作,记录,输出,再递归操作
								if ($temp=='0004444') {
									$list=$list.'<>'.$temp;
								}else{
									$list=$list.'|'.$temp;
								}
								//echo $temp.'|'.$i.$j.'';
								if ($temp=='0004444') {
									$dao[$k]['value']=$temp.'成功!!!!';
								}else{
									$dao[$k]['value']=$temp;
									$dao[$k]['child']=dao($temp);
									$k=$k+1;
								}
							}
						}
					}
				}
			}
		}
	}
	if (is_array($dao)) {
		return $dao;
	}
}
?>
网友评论