百度面试五只蚂蚁问题已解决

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std ;
#include<windows.h>
#include<math.h>

class AntParam
{
public:
 bool Direction ;//行走方向
 int Position ;//位置
} ;

const int Pos[5] = { 3, 7, 11, 17, 23 } ;

int main()
{
int EveryTime[32] ;//存储每一种情况的时间!
cout<<"进表示朝27端走,退表示朝0端走!!"<<endl ;
cout<<"***********************************************"<<endl ;
cout<<"输出的每种结果如下:"<<endl ;
//因方向的任意性,共有32中情况
unsigned int i ;
for( i = 0; i<=31; i++ )
{
 deque< AntParam > AntStack ;
 cout<<"方向:" ;
 //5只蚂蚁的参数赋值
 for( int j =0; j<5; j++ )
 {
  AntParam Ant;
  Ant.Position = Pos[j] ;
  unsigned int k = (unsigned int) pow( 2.0, j ) ;
  if ( (i&k) == 0 )
   Ant.Direction = false ;
  else
   Ant.Direction = true ;
  AntStack.push_front( Ant ) ;
  if(Ant.Direction)
   cout<<"进 " ;
  else
   cout<<"退 " ;
 }

 int Time = 0 ;
 do
 {
  Time++ ;
  deque< AntParam >::iterator m ;
  //每隔一秒蚂蚁移动一下!
  for( m = AntStack.begin(); m<AntStack.end(); m++ )
  {
   if( (*m).Direction )
    (*m).Position++ ;
   else
    (*m).Position-- ;
  }

  
  //找到位置相同(即相遇)的蚂蚁,不相邻的不能首先相遇,故只比较相邻的即可!
  for( m = AntStack.begin(); m<AntStack.end()-1; m++ )
  {
   if( ( *m ).Position == ( *(m+1) ).Position )
   {
    ( *m ).Direction = !( *m ).Direction ;
    ( *(m+1) ).Direction = !( *(m+1) ).Direction ;
   }
  }

  //删除已经到达端点的蚂蚁!
  //两端的蚂蚁线到达端点,每次判断back和front就可以了!!
  if( AntStack.back().Position == 0 || AntStack.back().Position == 27 )
   AntStack.pop_back() ;

  if(!AntStack.empty())//最后一个元素可能被上边的pop_back()给empty()了!不判断empty()就pop_front()会产生bug!
  {
   if( AntStack.front().Position == 0 || AntStack.front().Position == 27 )
    AntStack.pop_front() ;
  }
 }
 while( !AntStack.empty() ) ;
 //存储每一种情况的
 EveryTime[i] = Time ;
 cout<<"用时:"<<Time<< endl ;
 Time = 0 ;

}

//找到最大最小
int MaxTime=EveryTime[0];
int MinTime=EveryTime[0] ;

for( i =0; i<32; i++ )
{
 if( EveryTime[i]>MaxTime )
  MaxTime = EveryTime[i] ;
 if( EveryTime[i]<MinTime )
  MinTime = EveryTime[i] ;
}
cout<<"************************************************"<<endl ;
cout<<"最大时间:"<<MaxTime<<"秒"<<endl ;
cout<<"最小时间:"<<MinTime<<"秒"<<endl ;
Sleep( INFINITE ) ;
return 0 ;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值