全新整理:微軟、谷歌、百度等公司經典面試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[n];
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;
}