螞蟻都離開木杆 的一個解法

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

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