百度面试题目-5只蚂蚁

看到百度一道面试题:

   有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

以下是程序实现(java):



class Ant //蚂蚁类
{
int id;//蚂蚁编号
int pos;//蚂蚁当前位置
int direction;//移动方向
Ant(int i,int p,int d)
{
id
=i;
pos
=p;
direction
=d;
}


void Move()//蚂蚁移动..
{
    
if(direction==0)//如果向左移动
        this.pos--;
    
if(direction==1)//如果向右移动
        this.pos++;

}


}



public class AntWalk {

    
public static void MyAntWalk(int direc[])
    
{
         
int finished []=new int[5];//如果5个数组元素都是1代表5只蚂蚁全部走完
         int POS[]={3,7,11,17,23};//初始位置
         Ant A[]=new Ant[5];//出来了5只蚂蚁
          int StartDirection[]=new int[5];
          StartDirection
=direc;
         
int totaltime=0;//总共用时
         boolean flag=true;
         
         
        
for(int i=0;i<5;i++)
        
{
            A[i]
=new Ant(i,POS[i],StartDirection[i]);//初始化5只蚂蚁
            
            
        }

        
while(flag)
        
{
        
//System.out.print("POS:");
        
//    for(int aa=0;aa<5;aa++)
    
//            System.out.print(POS[aa]+"   ");
    
//    System.out.print("\n******************\n");
            for(int i=0;i<5;i++)//移动
            {  if(finished[i]==0)
              
{
                   A[i].Move();
                   POS[i]
=A[i].pos;//移动后更新位置
               }

                   
if(A[i].pos<=0||A[i].pos>=27)//如果走出去了
                        finished[i]=1;
            
                
            }

            
//判断是否有相撞
            for(int i=0;i<5;i++)
            
for(int j=0;j<5;j++)
                
{
                    
if((POS[i]==POS[j])&&i!=j)//相撞
                    {    
                        
if(A[i].direction==0)
                            A[i].direction
=1;
                        
else
                            A[i].direction
=0;
                        
                        
if(A[j].direction==0)
                            A[j].direction
=1;
                        
else
                            A[j].direction
=0;
                    }

                    
                }

            totaltime
++;
            
            
           
for(int k=0;k<5;k++)//判断是否全部出来
           {
              flag
= flag&&(finished[k]==1);
           }

           
            
if(flag)
                
{
                flag
=false;
                System.out.println(
"花费时间:"+totaltime);
                
return;
                  }

            
else
            
{
                flag
=true;
            }

            
        }

        
        
    }

    
    
public static void StartDirections(int d[],int i)//求方向 5只蚂蚁32种方向
    {
        
if(i==5)
        
{
            System.out.print(
"方向如下:");
            
for(int k=0;k<5;k++)
                System.out.print(d[k]
+"   ");
               
// System.out.print("\n");
                
            MyAntWalk(d);
            
        }

        
else
        
{
        
for(int j=0;j<=1;j++)
        
{
            d[i]
=j;
            StartDirections(d,i
+1);
            
            
        }

            
            
            
        }



    }

    
    
    
public static void main(String[] args) 
    
{   System.out.println("0代表向左 1代表向右");
        
int d[]=new int[5];
        StartDirections(d,
0);

    }


}

 

程序运行结果:

 

0代表向左 1代表向右
方向如下:
0   0   0   0   0   花费时间:23
方向如下:
0   0   0   0   1   花费时间:17
方向如下:
0   0   0   1   0   花费时间:23
方向如下:
0   0   0   1   1   花费时间:11
方向如下:
0   0   1   0   0   花费时间:23
方向如下:
0   0   1   0   1   花费时间:17
方向如下:
0   0   1   1   0   花费时间:23
方向如下:
0   0   1   1   1   花费时间:16
方向如下:
0   1   0   0   0   花费时间:23
方向如下:
0   1   0   0   1   花费时间:20
方向如下:
0   1   0   1   0   花费时间:23
方向如下:
0   1   0   1   1   花费时间:20
方向如下:
0   1   1   0   0   花费时间:23
方向如下:
0   1   1   0   1   花费时间:20
方向如下:
0   1   1   1   0   花费时间:23
方向如下:
0   1   1   1   1   花费时间:20
方向如下:
1   0   0   0   0   花费时间:24
方向如下:
1   0   0   0   1   花费时间:24
方向如下:
1   0   0   1   0   花费时间:24
方向如下:
1   0   0   1   1   花费时间:24
方向如下:
1   0   1   0   0   花费时间:24
方向如下:
1   0   1   0   1   花费时间:24
方向如下:
1   0   1   1   0   花费时间:24
方向如下:
1   0   1   1   1   花费时间:24
方向如下:
1   1   0   0   0   花费时间:24
方向如下:
1   1   0   0   1   花费时间:24
方向如下:
1   1   0   1   0   花费时间:24
方向如下:
1   1   0   1   1   花费时间:24
方向如下:
1   1   1   0   0   花费时间:24
方向如下:
1   1   1   0   1   花费时间:24
方向如下:
1   1   1   1   0   花费时间:24
方向如下:
1   1   1   1   1   花费时间:24

程序用递归产生了蚂蚁的移动方向,当然也可以非递归. 水平有限,感觉以上程序太暴力,还没想到好的方法..

 

=====================================================================

听了实验室帅兄的想法才知道,这题真是面试题...想到了真是简单.

两只蚂蚁相撞改变方向,我们完全可以不用理会. 因为结果还是和两只蚂蚁穿越一样,有两只蚂蚁继续向两边走去.

所以问题问题简单多了. 一眼看,就知道最大的时间是位置3的蚂蚁走到右端时间最长24.

最短是00011情况  程序实现也变得简单了

posted on 2009-10-21 17:20    阅读(617)  评论(0编辑  收藏  举报

导航