蚂蚁爬竹竿问题

有一根27厘米的细木杆,在第3厘米、7厘 米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或 调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

分析:最短时间11秒这里比较简单不做具体分析了。最大时间直接上代码

#include<stdio.h>

#define longness 27//定义竹竿的长度27cm
#define zero 0    //定义坐标原点
#define antsnum 5//定义蚂蚁数量

enum ants {A,B,C,D,E};//定义五个蚂蚁标签"A,B,C,D,E";
char ANTS[antsnum]={‘A‘,‘B‘,‘C‘,‘D‘,‘E‘};//打印输出标签
int position[antsnum]={3,7,11,17,23};//标定蚂蚁位置
int direction[antsnum]={1,1,1,1,0};//最长时间走向为‘A‘向右,‘B‘向右,‘C‘向右,‘D‘向右,‘E‘向左
int second=0;//初始化时间为0秒

/***************move_cal()*********************/
void move_cal()//行走计算函数
{
    int i;
    for( i=0;i<antsnum;i++)
    {

        if(direction[i]==1)
            position[i]++;
        else
         position[i]--;
        if(position[i]>=longness) position[i]=longness;
        if(position[i]<=zero)  position[i]=zero;
    }
}

/*****************change_direction()*************/
void change_direction(int direction[],int num)//当相遇时,改变方向
{
 int i,j;
 move_cal();
 for(i=0;i<num-1;i++)
     for(j=i;j<num;j++)
     if((position[i]==position[j])&&         (position[i]<longness&&position[i]>zero)&&         (position[j]<longness&&position[j]>zero))
         {
            direction[i]=(direction[i]+1)%2;
            direction[j]=(direction[j]+1)%2;
         }
}

/*****************judgement_result*************/
int judgement_result(int position[],int num)//判断完成任务情况
{
        int i;
        int result=0;

        for(i=0;i<num;i++)
        {
        if(position[i]>=longness) position[i]=longness;
        if(position[i]<=zero)  position[i]=zero;
        if(position[i]==longness||position[i]==zero)
            {
             result=result+1;
             printf("%c,已经完成任务!\n",ANTS[i]);
            }
        }
        return result;
}

/****************print()***********************/
void print()//打印输出结果
{
        printf("任务消耗%d\t秒,",second);
        printf("蚂蚁所在位置: A[%d],B[%d],C[%d],D[%d],E[%d]\n",        position[A],position[B],position[C],position[D],position[E]);

}

/*******************main()********************/
int main()
{
    while(judgement_result(position,antsnum)!=antsnum)//当任务没有完成时
    {
     second++;//秒加1
     change_direction(direction,antsnum);//判断是否改变路途方向
     print();//打印输出结果
    }
    printf("任务都完成了!\n");
    return 0;
 }

结果打印:

任务消耗1 秒,蚂蚁所在位置: A[4],B[8],C[12],D[18],E[22]
任务消耗2 秒,蚂蚁所在位置: A[5],B[9],C[13],D[19],E[21]
任务消耗3 秒,蚂蚁所在位置: A[6],B[10],C[14],D[20],E[20]
任务消耗4 秒,蚂蚁所在位置: A[7],B[11],C[15],D[19],E[21]
任务消耗5 秒,蚂蚁所在位置: A[8],B[12],C[16],D[18],E[22]
任务消耗6 秒,蚂蚁所在位置: A[9],B[13],C[17],D[17],E[23]
任务消耗7 秒,蚂蚁所在位置: A[10],B[14],C[16],D[18],E[24]
任务消耗8 秒,蚂蚁所在位置: A[11],B[15],C[15],D[19],E[25]
任务消耗9 秒,蚂蚁所在位置: A[12],B[14],C[16],D[20],E[26]
任务消耗10 秒,蚂蚁所在位置: A[13],B[13],C[17],D[21],E[27]
E,已经完成任务!
任务消耗11 秒,蚂蚁所在位置: A[12],B[14],C[18],D[22],E[27]
E,已经完成任务!
任务消耗12 秒,蚂蚁所在位置: A[11],B[15],C[19],D[23],E[27]
E,已经完成任务!
任务消耗13 秒,蚂蚁所在位置: A[10],B[16],C[20],D[24],E[27]
E,已经完成任务!
任务消耗14 秒,蚂蚁所在位置: A[9],B[17],C[21],D[25],E[27]
E,已经完成任务!
任务消耗15 秒,蚂蚁所在位置: A[8],B[18],C[22],D[26],E[27]
E,已经完成任务!
任务消耗16 秒,蚂蚁所在位置: A[7],B[19],C[23],D[27],E[27]
D,已经完成任务!
E,已经完成任务!
任务消耗17 秒,蚂蚁所在位置: A[6],B[20],C[24],D[27],E[27]
D,已经完成任务!
E,已经完成任务!
任务消耗18 秒,蚂蚁所在位置: A[5],B[21],C[25],D[27],E[27]
D,已经完成任务!
E,已经完成任务!
任务消耗19 秒,蚂蚁所在位置: A[4],B[22],C[26],D[27],E[27]
D,已经完成任务!
E,已经完成任务!
任务消耗20 秒,蚂蚁所在位置: A[3],B[23],C[27],D[27],E[27]
C,已经完成任务!
D,已经完成任务!
E,已经完成任务!
任务消耗21 秒,蚂蚁所在位置: A[2],B[24],C[27],D[27],E[27]
C,已经完成任务!
D,已经完成任务!
E,已经完成任务!
任务消耗22 秒,蚂蚁所在位置: A[1],B[25],C[27],D[27],E[27]
C,已经完成任务!
D,已经完成任务!
E,已经完成任务!
任务消耗23 秒,蚂蚁所在位置: A[0],B[26],C[27],D[27],E[27]
A,已经完成任务!
C,已经完成任务!
D,已经完成任务!
E,已经完成任务!
任务消耗24 秒,蚂蚁所在位置: A[0],B[27],C[27],D[27],E[27]
A,已经完成任务!
B,已经完成任务!
C,已经完成任务!
D,已经完成任务!
E,已经完成任务!
任务都完成了!
Press any key to continue

  

时间: 2024-07-29 14:39:49

蚂蚁爬竹竿问题的相关文章

蚂蚁爬杆问题js实现

面外包时,腾讯导师出的面试题,简单记录一下 运行效果 代码 <!DOCTYPE html> <html> <head> <title>蚂蚁爬杆实验</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> </head> <body> <div style=&

面向对象蚂蚁爬杆的问题

package cn.hncu.day5.ant; public class Ant { private int pos; private boolean isLeft = true;// 默认朝左 private boolean isDown = false;// 默认在细杆上 private final static int LEFT_END=0; private final static int RIGHT_END=27; private static int numOfDown; pri

编程之美4.7 | 蚂蚁爬杆

有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L).刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个蚂蚁都以速度v向前走,当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走,速度不变.编写程序求所有蚂蚁都离开木杆的最短时间和最长时间. 解法: 我们假设每只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头.这种情况下,每次有一只蚂蚁离开木杆都意味着一袋粮食离开木杆(虽然

编程之美---蚂蚁爬杆

一根长27cm的木棍上,在5个点上有5只蚂蚁,蚂蚁在开始的时候朝任意方向出发,只能掉头或者往前走.让任意两只蚂蚁碰头时,它们同时掉头朝反方向走.假设蚂蚁的速度都是一秒一厘米,求蚂蚁都离开木棍的最短时间和最长时间. 蚂蚁相遇后掉头往反向走,可以看作蚂蚁相遇后,擦肩而过,相当于两只蚂蚁互换了各自的行程.所以把每只蚂蚁离自己较远的一端,和较近的一端计算出来,分别取最大值,就是最长时间和最短时间. 扩展问题 参考网址 http://blog.csdn.net/weichaohnu/article/det

4.7 蚂蚁爬杆

题目:有一根树枝,树枝很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退. 当两只蚂蚁碰头时,它们会同时调头朝反方向走. 求所有蚂蚁都离开木杆的最短时间和最长时间. 思想:虽然两只蚂蚁相遇后是调头往反方向走,但是,可以"看作"两个蚂蚁相遇后,擦身而过. 也就是说,可以认为蚂蚁的运动是独立的,是否碰头并不是重点. 所以,程序只需要遍历所有的蚂蚁,把每个蚂蚁走出木杆的最长时间(蚂蚁向离自己较远的一端走去),最短时间(蚂蚁向离自己较近的一端走去

蚂蚁爬杆问题(Java面向对象)

有一根27厘米的细木杆,在第3厘米.7厘米.11厘米.18厘米.23厘米这五个位置上各有一只蚂蚁.木杆很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退.当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走.假设蚂蚁们每秒钟可以走一厘米的距离.编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间. 要求:用类模拟出蚂蚁的行为特性,进而模拟出五只蚂蚁在木杆上的运行过程来编程求解.不能通过数学的方式直接用公式计算. 解题思路: 把每个蚂蚁当作一个对象操作,

蚂蚁爬杆问题

思路, 为了考虑最长的时间,假设两只蚂蚁相遇后不调头,这样每只蚂蚁都是独立运动的,只要求蚂蚁到杆子端点的距离就好了 int L, n; int arr[MAX_N]; int solve() { int minT = 0; for(int i=0; i<n; ++i) { minT = max(minT, min(arr[i],L-arr[i])); } int maxT = 0; for(int i=0; i<n; ++i) { maxT = max(maxT, max(arr[i],L-a

蚂蚁爬杆

问题: 解答: 伪代码如下: void CalcTime(double Length,// length of the stick double *XPos,//position of an ant,<=length int AntNum,  //number of ants double Speed, //speed of ants double &Min,//return value of the minimum time double &Max)//return value o

蚂蚁问题

最近做了几个蚂蚁问题,还蛮有趣的..... 蚂蚁问题第一弹:poj 1852 Ants: Ants Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12214   Accepted: 5366 Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a w