跳河问题的php求解

有个智力题是,一大批人(500人)排成一条直线,从头开始


不难想到求解方法是寻找2的倍数。。出于好玩,用php写了下程序求解,用html表现过程与结果。



<style>

table tr th{
	border: 1px solid #ccc;
	background: #cef;
}

table tr td{
	border: 1px solid #ccc;
	background: #efc;
}



</style>
<?php


//队伍
$persons=array();
//开始人数
$start_person_count=500;

for($i=0;$i<$start_person_count;$i++){
	$persons[$i]=array();
}

//初始化,每个人发个号码
foreach($persons as $k=>$v){
	$persons[$k][0]=$k+1;
}


//当前还有多少人没跳河
$alive_count=$start_person_count;
//当前进行到了第几次循环
$circle=0;

while($alive_count>1){
	
	$point=1; //指向当前计算第几个人
	foreach($persons as $k=>$v){
	
		$next_circle=$circle+1;
		if($persons[$k][$circle]>0){ //此人没跳河,有一个比0大的号码
			
			//计算ta是第几个人
			if($persons[$k][$circle]%2==1){ //单数,跳河,下轮标记为-1了
				$persons[$k][$next_circle]=-1;
				$alive_count--;
				//echo '还有'.$alive_count.'个人在<br/>';
				if($alive_count==1){
					break;
				}
			}
			else{ //领下轮的号码
				$persons[$k][$next_circle]=$point;
				$point++;
			}
		}
		else{
				$persons[$k][$next_circle]=-1;
		}
	}
	$circle++;
}

//输出最后生存者的号码
foreach($persons as $k=>$v){
	if(isset($v[$circle])){
		if($v[$circle]>0){
			echo '此人是第'.($k+1).'号';
		}
	}
}

//格式化输出过程
//print_r($persons);
echo '<br/><br/>详细过程如下:<br/><table>';


for($c=0;$c<=$circle;$c++){
	echo '<tr>';
	foreach($persons as $k=>$v){
		if(isset($v[$c])){
			if($v[$c]==-1){
				$stat='<div style="background:#faa;"> </div>';
			}
			else{
				$stat=$v[$c];
			}
			if($c==0){
				echo '<th>'.$stat.'</th>';
			}
			else{
				echo '<td>'.$stat.'</td>';
			}
			
		}
	}
	echo '</tr>';
}
echo '</table>';




?>


浏览器里查看效果如下:








©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值