#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 ;
}