java算法题——龟兔赛跑

问题描述话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感... 问题描述
  话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
  然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
  输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)
输出格式
  输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
  第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入
10 5 5 2 20
样例输出
D
4
样例输入
10 5 5 1 20
样例输出
R
3
样例输入
10 5 5 3 20
样例输出
T
4

里面有个一测评点的数据是这样的
输入:
25 10 20 3 100
输出:
R

7
我就不明白我自己用手算的好像不是这个结果哇
我自己算的是
T
10
求解答。。。
展开
 我来答
yugi111
2014-05-06 · TA获得超过8.1万个赞
知道大有可为答主
回答量:5.1万
采纳率:70%
帮助的人:1.3亿
展开全部
package p1;

import java.util.Scanner;

/**
 * 龟兔赛跑
 * 
 * @author yugi
 */
public class TortoiseHare
{
public static final String T = "T";
public static final String R = "R";
public static final String D = "D";

private static void race ( int v1, int v2, int t, int s, int l, 
int start1, int start2, int s1, int s2, int time,
boolean rest )
{
if (
v1 < 0 || v2 < 0 || t < 0 || s < 0 || l < 0 
|| v1 > 100 || v2 > 100 || t > 300 || s > 10 || l > 10000
|| l % v1 != 0 || l % v2 != 0
   )
{
try
{
throw new Exception ("参数输入不合标准 !");
}
catch (Exception e)
{}
}
else
{
// 兔子或乌龟已经到达终点
if (s1 >= l || s2 >= l)
{
if (s1 > s2)
{
System.out.println (R);
System.out.println (time + start1);
}
else if (s1 < s2)
{
System.out.println (T);
System.out.println (start2);
}
else
{
System.out.println (D);
System.out.println (start2);
}
return;
}

// 兔子开始休息
if (!rest && s1 - s2 >= t)
{
rest = true;
time += s;
}

// 兔子休息了s秒 (不包括s秒, 第s秒开始行动, 题目意思不是s秒之后)
if (rest && start2 - start1 >= s)
{
// 开始跑了 (不休息)
rest = false;
}

// 兔子不休息的时候跑
if (!rest)
{
start1++;
s1 = v1 * start1;
}

// 乌龟总在跑
start2++;
s2 = v2 * start2;

// 递归调用
race (v1, v2, t, s, l, start1, start2, s1, s2, time, rest);
}
}

public static void main ( String[] args )
{
System.out.println ("输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l," +
"\n其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)" +
"\n退出输入n/N, 否则继续: ");
Scanner scanner = new Scanner (System.in);
String line = null;
String reg = "^([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)\\s+([1-9]\\d*|\\d)$";
while (scanner.hasNextLine ())
{
line = scanner.nextLine ().trim ();
if ("n".equalsIgnoreCase (line))
{
break;
}
if (!line.matches (reg))
{
System.err.println ("输入不对, 重新输入: ");
}
else
{
String[] input = line.split ("\\s+");
int v1 = Integer.parseInt (input[0]);
int v2 = Integer.parseInt (input[1]);
int t = Integer.parseInt (input[2]);
int s = Integer.parseInt (input[3]);
int l = Integer.parseInt (input[4]);
race (v1, v2, t, s, l, 0, 0, 0, 0, 0, false);
System.out.println ("退出输入n/N, 否则继续: ");
}
}
scanner.close ();
}
}

 

追问
兔子休息了s秒 (不包括s秒, 第s秒开始行动, 题目意思不是s秒之后)
这个有点不明白~
可以写出来每一秒兔子和乌龟已经走的路程吗
只用写25 10 20 3 100这个测试数据的

就是像这样:
兔:25 50 50 50 75 75 75 95 115
龟:10 20 30 40 50 60 70 80 90
这样的~
谢谢你了
追答
自己到里面加打印语句,s1,s2分别是2个的每秒路程
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
田真久
2014-05-06 · TA获得超过661个赞
知道小有建树答主
回答量:603
采纳率:100%
帮助的人:325万
展开全部
public class Test1{


public static void main(String[] args) throws InterruptedException {
   int v1=25,v2=10,t=20,s=3,l=100;
          
          
         Scanner scanner=new Scanner(System.in);
           
         v1=scanner.nextInt();    
          v2=scanner.nextInt();
         t=scanner.nextInt();
         s=scanner.nextInt();
         l=scanner.nextInt();
          
         int sum1=0,sum2=0;
         boolean stop=false;
         int stopcount=0;
         int i=0;
         for ( i = 0; i < l/v2; i++) {
             
          
          if(sum1>=l||sum2>=l)//如果有一个跑到了终点就结束了
          break;
          
             if(stopcount==s)
                 stop=false; //如果休息的时间够了,就开始跑
              
              
             if(sum1-sum2>=t)
                 stop=true; //如果超过了t米,就休息
              
              
             if(!stop)
                sum1+=v1; //当兔子不休息的时候跑
             else
                 stopcount++; //休息的时间计数
              
             sum2+=v2;//乌龟每次都会跑
              
              
             System.out.print("兔子跑了:"+sum1+"米");
             System.out.println("乌龟跑了:"+sum2+"米");
        }
         if(sum1==sum2)
             System.out.println("D"+i);
         else if(sum1>=l)
             System.out.println("R"+i);
         else if(sum2>=l)
             System.out.println("T"+i);
}
}
追问
可不可以帮我写一下当测试数据是
25 10 20 3 100的时候

每一秒兔子和乌龟的运动情况哇
谢谢了~
追答

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式