蚂蚁爬杆的面试题(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向右爬

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