題目如下:
有一根27釐米的細木杆,在第3釐米、7釐米、11釐米、17釐米、23釐米這五個位置上各有一隻螞蟻。木杆很細,不能同時通過一隻螞蟻。開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一釐米的距離。編寫程序,求所有螞蟻都離開木杆的最小時間和最大時間。
問題分析:杆就是數軸,螞蟻就是點,左和右兩個狀態就是0和1,螞蟻方向的初始狀態有00000到11111一共32 種狀態,PHP中使用
decbin($number) 函數將數字轉成二進制,由於必須要5位,再用 str_pad($number,5,"0",STR_PAD_LEFT)在$number左方補齊0,總位數5位,在用 str_split($number)將數組拆分成一個個數字的數組,這個數組就是螞蟻的初始狀態
代碼如下,兩個函數暴力破解
function begin(){
$arr=[];
for($i=0;$i<32;$i++){
$arr[str_pad(decbin($i),5,"0",STR_PAD_LEFT)]=move(str_split(str_pad(decbin($i),5,"0",STR_PAD_LEFT)));
}
return $arr;
}
function move($arr){
$brr=[3,7,11,17,23];
$n=-1;
while (count($brr)>=1){
//這個for循環每一個大循環完畢,就是所有的螞蟻都走了一步,若出界,則刪除數組元素
for($i=0;$i<count($brr);$i++){
if($arr[$i]==0){
$brr[$i]--;
if($brr[$i]==0){//左出界
array_shift($brr[$i]);
array_shift($arr[$i]);
}
}elseif($arr[$i]==1){
$brr[$i]++;
if($brr[$i]==27){//右出界
array_pop($brr[$i]);
array_pop($arr[$i]);
}
}
}
//再次循環代表螞蟻的數組,若有座標一樣的,調轉代表方向的0和1
for($i=0;$i<count($brr)-1;$i++){
if($brr[$i]==$brr[$i+1]){
if($arr[$i]==0){
$arr[$i]=1;
$arr[$i+1]=0;
}else{
$arr[$i]=0;
$arr[$i+1]=1;
}
}
}
$n++;
}
return $n;
}
print_r(begin());
//最後排序去除最小和最大值就行了
還有bug,可能是代碼邏輯有問題,當條件爲01100和11111的時候,數據是不對的,有空檢查一下
實際分析問題的時候其實用不着分析碰頭的情況,碰頭的時候完全可以看做螞蟻互相穿過,所以很明顯的最長時間爲最右側的螞蟻向左爬用的時間,最短是3,7,11向左爬,17,23向右爬