黑马程序员技术交流社区
标题:
一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
[打印本页]
作者:
Mayer
时间:
2016-1-20 23:43
标题:
一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
问题如上,求指点代码可以改进的地方。
package com.itheima;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeMap;
/**
* 第十题: 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
*
* 思路:第一步.将猫,狗,鱼这三个对象存放在Map中。
* 第二步.如果第一次老农带走的的是狗或鱼中的一个对象或一次性带走两个或三个动物过河时,会出错,警告老农必须首先带走的是猫,且每次带走一只动物,带走猫就阻断了食物链的中间环节,阻止动物相残。
* 第三步.老农带走猫后,接着分别带走狗和鱼。
* */
public class Test10 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub \
TreeMap<Integer,String> tm = new TreeMap<Integer,String>(); //创建动物容器
tm.put(1, "猫");
tm.put(2, "狗");
tm.put(3, "鱼");
StringBuilder sb = new StringBuilder();
int count = 1; //计数,用于标记老农第几次过河。
boolean flag;
Farmer f = new Farmer(); //创建老农对象
int num;
while(count<4){ //总共三次(count)即可带走所有动物
num = f.choice(); //返回动物在TreeMap(tm)中对应的键。
if(num!=-1){
String name = tm.get(num);
flag = f.bringAnimal(name,count);//用于判断老农是否是有效的带动物过河
if(flag){
tm.remove(num); //老农已经将动物带过河,删除容器中已经带过河的动物,避免出错。
System.out.println(name+"已经被带过河,请别重复选择");
count++;
}
}
}
}
}
class Farmer{
//老农选择带什么动物过河
public static int choice() throws IOException{
System.out.println("请选择一只动物带过河,数字1代表猫,数字2代表狗,数字3代表鱼,请输入对应数字:");
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//让老农选择带走的一只动物
String reg = "[123]";//正则表达式,判断输入的是不是一只动物。
String str;
if((str = bufr.readLine())!=null){
if(!str.matches(reg)) //用于判断老农是不是只带一只动物
choice(); //递归,重新键盘输入
return Integer.parseInt(str);
}
bufr.close();
return -1;
}
//老农带动物过河
public static boolean bringAnimal(String name,int count) throws IOException{
if(count==1 ){
if(!("猫".equals(name))){ //判断第一次带的动物是不是猫
System.out.println("请你第一次带走猫,避免动物相互残杀。");
return false;
}
else{
System.out.println("老农第"+count+"次过河,带的是:"+name);
return true;
}
}
else if(count == 2){
System.out.println("老农第"+count+"次过河,带的是:"+name);
return true;
}
else{
System.out.println("老农第"+count+"次过河,带的是:"+name+",所有动物都带过河");
return true;
}
}
}
复制代码
作者:
qt520
时间:
2016-1-21 08:22
学习了,这种题目还能用这种方法解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2