有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
ant.cpp
#include<iostream>
#include<deque>
#include<algorithm>
#include<math.h>
using namespace std;
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中情况
for( int 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( int 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;
return 0;
}
编译:(Linux, gcc)
g++ -O3 -Wall ant.cpp -o ant.elf
运行:(bash shell)
./ant.elf
结果:
xyz@xyz:/media/xyz/disk_e/Linux/posix_unix_api$ g++ -O3 -Wall ant.cpp -o ant.elf
xyz@xyz:/media/xyz/disk_e/Linux/posix_unix_api$ ./ant.elf
进表示朝27端走 退表示朝0端走
***********************************************
输出的每种结果如下:
方向 退 退 退 退 退 用时:23
方向 进 退 退 退 退 用时:24
方向 退 进 退 退 退 用时:23
方向 进 进 退 退 退 用时:24
方向 退 退 进 退 退 用时:23
方向 进 退 进 退 退 用时:24
方向 退 进 进 退 退 用时:23
方向 进 进 进 退 退 用时:24
方向 退 退 退 进 退 用时:23
方向 进 退 退 进 退 用时:24
方向 退 进 退 进 退 用时:23
方向 进 进 退 进 退 用时:24
方向 退 退 进 进 退 用时:23
方向 进 退 进 进 退 用时:24
方向 退 进 进 进 退 用时:23
方向 进 进 进 进 退 用时:24
方向 退 退 退 退 进 用时:17
方向 进 退 退 退 进 用时:24
方向 退 进 退 退 进 用时:20
方向 进 进 退 退 进 用时:24
方向 退 退 进 退 进 用时:17
方向 进 退 进 退 进 用时:24
方向 退 进 进 退 进 用时:20
方向 进 进 进 退 进 用时:24
方向 退 退 退 进 进 用时:11
方向 进 退 退 进 进 用时:24
方向 退 进 退 进 进 用时:20
方向 进 进 退 进 进 用时:24
方向 退 退 进 进 进 用时:16
方向 进 退 进 进 进 用时:24
方向 退 进 进 进 进 用时:20
方向 进 进 进 进 进 用时:24
************************************************
最大时间:24秒
最小时间:11秒
xyz@xyz:/media/xyz/disk_e/Linux/posix_unix_api$