您的位置:首页 > 其它

蚂蚁都离开木杆 的一个解法

2011-04-03 16:32 267 查看
全新整理:微软、谷歌、百度等公司经典面试100题
26、有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。
当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。
编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

enum ORI
{
lo = 0,
ro
};
struct ant
{
int w;
ORI r;
};
void findmaxmin(int l, int *p, int n, int &min, int &max)
{
ant * q = new ant
;
int m = pow(2, n);
min = 10000000;
max = 0;
for(int i=0;i<m;i++)
{
unsigned flag = 1;
for(int j=0;j<n;j++)
{
q[j].w = p[j];
q[j].r = i&flag?lo:ro;
flag <<= 1;
}
int nCnt = 0;
int nAnt = 5;
while(nAnt)
{
for(int k=0;k<n;k++)
{
if(q[k].w!=0 &&q[k].w!=l)
{
if(q[k].r==lo)
q[k].w--;
else
q[k].w++;
if(q[k].w==0 ||q[k].w==l)
nAnt--;
}
}
for(int k=0;k<n;k++)
{
for(int t=k+1;t<n;t++)
{
if(q[k].w==q[t].w)
{
q[k].r = q[k].r==lo?ro:lo;
q[t].r = q[t].r==lo?ro:lo;
}
}
}
nCnt++;
}
if(nCnt<min) min = nCnt;
if(nCnt>max) max = nCnt;
}
delete []q;
}
int _tmain(int argc, _TCHAR* argv[])
{
int min, max;
int p[5] = {3,7,11,17,23};
findmaxmin(27, p, 5, min, max);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐