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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值