百度面试题目-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
方向如下: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情况 程序实现也变得简单了



浙公网安备 33010602011771号