【C语言】解决龟兔赛跑的问题

龟兔赛跑

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

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值