PHP实现的蚂蚁爬杆路径算法代码
本文实例讲述了PHP实现的蚂蚁爬杆路径算法代码。分享给大家供大家参考,具体如下:
<?php
/**
*有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
*木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,
*但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。
*编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
*/
functionadd2($directionArr,$count,$i){
if(0>$i){//超出计算范围
return$directionArr;
}
if(0==$directionArr[$i]){//当前位加1
$directionArr[$i]=1;
return$directionArr;
}
$directionArr[$i]=0;
returnadd2($directionArr,$count,$i-1);//进位
}
$positionArr=array(//所在位置
3,
7,
11,
17,
23
);
functionpath($positionArr){//生成测试路径
$pathCalculate=array();
$count=count($positionArr);
$directionArr=array_fill(0,$count,0);//朝向
$end=str_repeat('1',$count);
while(true){
$path=implode('',$directionArr);
$pathArray=array_combine($positionArr,$directionArr);
$total=calculate($positionArr,$directionArr);
$pathCalculate['P'.$path]=$total;
if($end==$path){//遍历完成
break;
}
$directionArr=add2($directionArr,$count,$count-1);
}
return$pathCalculate;
}
functioncalculate($positionArr,$directionArr){
$total=0;//总用时
$length=27;//木杆长度
while($positionArr){
$total++;//步增耗时
$nextArr=array();//下一步位置
foreach($positionArras$key=>$value){
if(0==$directionArr[$key]){
$next=$value-1;//向0方向走一步
}else{
$next=$value+1;//向1方向走一步
}
if(0==$next){//在0方向走出
continue;
}
if($length==$next){//在1方向走出
continue;
}
$nextArr[$key]=$next;
}
$positionArr=$nextArr;//将$positionArr置为临时被查找数组
foreach($nextArras$key=>$value){
$findArr=array_keys($positionArr,$value);
if(count($findArr)<2){//没有重合的位置
continue;
}
foreach($findArras$findIndex){
$directionArr[$findIndex]=$directionArr[$findIndex]?0:1;//反向处理
unset($positionArr[$findIndex]);//防止重复查找计算
}
}
$positionArr=$nextArr;//将$positionArr置为下一步结果数组
}
return$total;
}
$pathCalculate=path($positionArr);
echo'<pre>calculate-';
print_r($pathCalculate);
echo'sort-';
asort($pathCalculate);
print_r($pathCalculate);
希望本文所述对大家PHP程序设计有所帮助。