龟兔赛跑
PTA基础编程题目集7-22
龟兔赛跑这一问题可能有很多解答方法,例如结合数学图像之类的经典方法,除此之外,我还想到了一种方法。下面来看解析。
题目简介: 乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@ _ @,兔子赢则输出^ _ ^,平局则输出- _ -;后跟1空格,再输出胜利者跑完的距离。
案例
输入样例:
242
输出样例:
@_@ 726
思路
分析问题:乌龟速度 3 m/mim ;兔子速度:9 m/min
兔子每10分钟看一次路程,
如果超过乌龟,则兔子休息30min,需要注意的是,兔子休息期间,没有路程的增加,那么我们对此状态进行标记(mark),并记录休息结束时的时间(rest_time);
如果没超过乌龟,则继续跑10min。
乌龟则是一直再跑。
代码如下:(附带注释)
//龟兔赛跑
#include <stdio.h>
#define Tortoise_speed 3
#define Rabbit_speed 9
typedef struct {
int t_run;
int mark;
}Tortoise; //乌龟
typedef struct {
int r_run;
int mark; //标记是否休息
int rest_time; //记录休息的时间
}Rabbit;
void init_Tortoise(Tortoise* p); //初始化乌龟的数据
void init_Rabbit(Rabbit* p); //初始化兔子的数据
void compare(Tortoise* p,Rabbit* q); //比较获胜
void Distance_Tortoise(Tortoise* p,int time); //计算乌龟的行程
void Distance_Rabbit(Rabbit* p,int time); //计算兔子的行程
int main(void)
{
int i;
Tortoise Tor_1; //生成一只乌龟
Rabbit Rab_1; //生成一只兔子
int time;
init_Tortoise(&Tor_1); //对这只乌龟进行初始化
init_Rabbit(&Rab_1) ; //对这只兔子进行初始化
scanf("%d",&time);
int t = 0;
while(t!=time){
if(t%10==0&&Rab_1.mark==0){ //兔子在跑
if(Tor_1.t_run<Rab_1.r_run){ //兔子超过了乌龟
Distance_Tortoise(&Tor_1,1); //只有乌龟跑
Rab_1.mark = 1;
Rab_1.rest_time = t + 30; //兔子要休息了,记录30min
}else{ //兔子没有超过乌龟,两个一起跑
Distance_Tortoise(&Tor_1,1);
Distance_Rabbit(&Rab_1,1);
}
}else{ //当时间不是10的倍数时
if(Rab_1.mark==0){ //判断兔子的状态,0为跑步,1为休息
Distance_Tortoise(&Tor_1,1);
Distance_Rabbit(&Rab_1,1);
}else{ //兔子在休息
Distance_Tortoise(&Tor_1,1);
}
}
++t; //时间一分一分的流逝
if(Rab_1.rest_time == t){ //判断是否到了30min,到了兔子就更换状态,休息时间变为0
Rab_1.mark = 0;
Rab_1.rest_time = 0;
}
}
compare(&Tor_1,&Rab_1); //比较
//printf("\n乌龟:%d 兔子:%d",Tor_1.t_run,Rab_1.r_run); //测试
}
void init_Tortoise(Tortoise* p){ //初始化乌龟的数据
p->t_run = 0;
p->mark = 0;
}
void init_Rabbit(Rabbit* p){ //初始化兔子的数据
p->r_run = 0;
p->mark = 0; //0代表正在跑,1代表休息
p->rest_time = 0; //当前30min 已经休息的时间
}
void compare(Tortoise* p,Rabbit* q){ //比较获胜
if(p->t_run>q->r_run){ //乌龟获胜
printf("@_@ %d",p->t_run);
}else if(p->t_run==q->r_run){ //平局
printf("-_- %d",p->t_run);
}else{ //兔子获胜
printf("^_^ %d",q->r_run);
}
}
void Distance_Tortoise(Tortoise* p,int time){ //乌龟行程
p->t_run += Tortoise_speed * time;
}
void Distance_Rabbit(Rabbit* p,int time){ //兔子行程
p->r_run += Rabbit_speed * time;
}
运行结果如下:
242
@_@ 726