螞蟻爬杆的面試題(PHP解法)

題目如下:

有一根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向右爬

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章