题目:
7-22 龟兔赛跑
乌龟与兔子进行赛跑,跑场是一个矩型跑道,跑道边可以随地进行休息。乌龟每分钟可以前进3米,兔子每分钟前进9米;兔子嫌乌龟跑得慢,觉得肯定能跑赢乌龟,于是,每跑10分钟回头看一下乌龟,若发现自己超过乌龟,就在路边休息,每次休息30分钟,否则继续跑10分钟;而乌龟非常努力,一直跑,不休息。假定乌龟与兔子在同一起点同一时刻开始起跑,请问T分钟后乌龟和兔子谁跑得快?
输入格式:
输入在一行中给出比赛时间T(分钟)。
输出格式:
在一行中输出比赛的结果:乌龟赢输出@_@
,兔子赢输出^_^
,平局则输出-_-
;后跟1空格,再输出胜利者跑完的距离。
输入样例:
242
输出样例:
@_@ 726
代码:
#include<stdio.h>
int main()
{
int time;
scanf("%d",&time);
int i;
int x=0,y=0,b,c,d,n;
int e=4;
for(i=1;i<=time;i++)
{
if(i<10)
{
x+=9;
y+=3;
}
else
{
if(e==4)
{
n=i;
c=n;
x+=9;
y+=3;
if(x>y)
{
e=0;
}
else
e=1;
continue;
}
else if(e==5)
{
n=i;
c=n;
y+=3;
if(x>y)
{
e=0;
}
else if(x==y)
{
e=1;
}
else e=1;
continue;
}
else if(e==0)
{
if(i==(c+29))
{
y+=3;
n++;
e=5;
}
else if(i<c+29)
{
y+=3;
n++;
}
}
else if(e==1)
{
if(i==c+9)
{
x+=9;
y+=3;
n++;
e=4;
}
else if(i<c+9)
{
x+=9;
y+=3;
n++;
}
}
}
}
if(x>y)
{
printf("^_^ %d",x);
}
else if(x<y)
{
printf("@_@ %d",y);
}
else printf("-_- %d",x);
return 0;
}
解题思路:
这道题需要判断在输入时间(定义为 time)的两个变量 兔子的路程(定义为X)和 乌龟的路程(定义为Y)的大小。根据题目我们可以把整个运动的所有时间分为4种情况来表示,并用一个变量对他进行定义(e), 再通过FOR循环对一开始到要确定时间TIME的每时每刻的X,Y情况进行分析,最终确定输入时间的X,Y大小,再输出相应内容。
e为自由定义,这里e=4表明兔子和乌龟在一起跑,e=5表示兔子休息,乌龟在跑
所有情况如下
1.(1-9分钟):e=4 (一起跑)
兔子和乌龟同时从起点出发
(i<=9)
兔子:x=x+9;
乌龟:y=y+3;
2. 达到判断点:若X>Y则e=0(兔子休息30分)否则e=1(一起跑10分)
到达判断点时 若e=4 则先加上兔子和乌龟跑的一分钟路程
兔子:x=x+9;
乌龟:y=y+3;
若e=5 则只加上乌龟的路程
乌龟y=y+3;
再对X和Y进行判断
若X>Y则e=0(兔子要休息30分钟)
否则 e=1(一起跑10分钟)
那么这里如何保证在这30分钟时间内兔子路程不增加且乌龟路程增加呢?
1.先用一个变量记录下达到临界点的time :
n=i;
2.再用一个变量记录下n的值:
c=n;
3.让 n<c+29 的情况下让乌龟路程增加,且每次增加n都自加,这样乌龟可以走28次,第29次时让情况变量e=5(兔子休息情况),这样乌龟走了29步
if(i==(c+29))
{
y+=3;
n++;
e=5;
}
else if(i<c+29)
{
y+=3;
n++;
}
4.最后一步到达判断点,像上面一样根据e的值加上最后一步的路程然后对X,Y进行判断:
到达判断点时 若e=4 则先加上兔子和乌龟跑的一分钟路程
兔子:x=x+9;
乌龟:y=y+3;
若e=5 则只加上乌龟的路程
乌龟y=y+3;
再对X和Y进行判断
若X>Y则e=0(兔子要休息30分钟)
否则 e=1(一起跑10分钟)
那么如何实现让兔子和乌龟一起跑10分钟的代码呢
同上
1.先 用一个变量记录下达到临界点的time :
n=i;
2.再用一个变量记录下n的值:
c=n;
3.让 n<c+9 的情况下让乌龟路程增加,且每次增加n都自加,这样兔子和乌龟可以一起跑8次,到第9次时让情况变量e=4(一起跑情况),这样兔子和乌龟一起跑了9分钟,最后一分钟到达判断点,和最开始到达判断点一样根据兔子是否休息,再判断X,Y前把最后一步的路程加上
if(i==(c+9))
{
x=x+9;
y+=3;
n++;
e=5;
}
else if(i<c+9)
{
x=x+9;
y+=3;
n++;
}
4.到达临界点同上进行判断
这样我们就实现了从起点出发后兔子休息和不休息两种状态情况下且时间不同的代码编写
3.根据e的值进入相应的if语句进行判断
for(i=1;i<=time;i++) 从第一分钟开始到给定时间进行运算
{
if(i<10)从起步到进入判断点前1分钟
{
x+=9;
y+=3;一起跑的路程
}
else 脱离前9分钟后的路
{
if(e==4) 兔子没休息的情况
{
n=i; 用n记录下当前的时间(n会变,进行自加代表过了一分钟)
c=n; 用c记录下(c不会变,c+xx代表xx分钟后)
x+=9;
y+=3; 加上这一分钟一起跑的路程
if(x>y) 对到达判断点时乌龟和兔子的路程判断
{
e=0;兔子比乌龟快,兔子休息30分钟
}
else
e=1;乌龟比兔子快,兔子不休息10分钟
continue;
}
else if(e==5)若到达临界点前(时)兔子在休息
{
n=i; 用n记录下当前的时间(n会变,进行自加代表过了一分钟)
c=n; 用c记录下(c不会变,c+xx代表xx分钟后)
y+=3;加上这一分钟乌龟走的路程
if(x>y) 对到达判断点时乌龟和兔子的路程判断
{
e=0;兔子比乌龟快,兔子休息30分钟
}
else
e=1;乌龟比兔子快,兔子不休息10分钟
continue;
}
else if(e==0)若兔子在休息状态
{
if(i==(c+29))当兔子休息到第29分钟
{
y+=3;乌龟在走
n++;过了一分钟
e=5;修改状态为到达判断点时的兔子休息状态
}
else if(i<c+29)兔子休息前28分钟
{
y+=3;
n++;增加乌龟走的路,记录时间增加
}
}
else if(e==1)若兔子在跑步状态
{
if(i==c+9)兔子跑到第9分钟
{
x+=9;
y+=3;加上一起跑的路程
n++;过一分钟
e=4;修改状态为到达判断点时的兔子跑步状态
}
else if(i<c+9)
{
x+=9;前八分钟一起跑
y+=3;
n++;
}
}
}
}
4.最终对给定时间后兔子和乌龟的路程进行比较
if(x>y)
{
printf("^_^ %d",x);
}
else if(x<y)
{
printf("@_@ %d",y);
}
else printf("-_- %d",x);
return 0;
}
昨天碰到了这道题最后三问总是不对,我打算自己修改,从0开始不断分析问题,经过近百次调试修改,于第二天2:21分终于全对,记录下自己笨蛋但是成就感十足的解法.