百度面试五只蚂蚁

本程序模拟五只蚂蚁在一条线上相向而行的情景,通过调整每只蚂蚁的初始方向来观察所有可能的情况,并记录从开始到所有蚂蚁相遇并掉头的最大及最小所需时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有一根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$ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值