黑马程序员技术交流社区

标题: 基础测试的一个,求大神 [打印本页]

作者: 止询初衷    时间: 2014-8-4 22:16
标题: 基础测试的一个,求大神
          一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
          当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。 编程解决猫狗鱼过河问题。
       


作者: 王松朝    时间: 2014-8-4 22:43
恶意刷贴会被扣分的
作者: hejinzhong    时间: 2014-8-4 22:55
先把猫拿过去,回来随便拿一个过去,再将猫带回来,将剩下的一个拿过去,最后回来拿猫
作者: 掌柜的--刘饮    时间: 2014-8-4 23:47
李饶亮 老师的公开课 面对对象 猫狗鱼 过河问题,你到传智播客公开课里搜搜,很经典的讲解
作者: 从未有过的晴天    时间: 2014-8-5 00:21
这么恶心的题 copy答案
作者: ┣┫流枫    时间: 2014-8-5 00:32
流程二  技术分就这么多了   
作者: 何磊    时间: 2014-8-5 20:52
灌水帖,鉴定完毕
作者: 罗超8849    时间: 2014-8-6 00:00
学习一下。。。。。。。。
作者: 阿磊    时间: 2014-8-6 08:32
学习一下
作者: 周峰峰    时间: 2014-8-6 11:46
学习一下
作者: 641283812    时间: 2014-8-6 12:02
有意思的问题,哈哈。学习一下。
作者: 200米王朝    时间: 2014-8-6 12:03
大致思路:

if (猫 && 狗) ||  (猫 && 鱼)
the game over ;

else continue;
作者: 暗夜星辰    时间: 2014-8-6 19:21
  1. package com.itheima;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. public class Test10 {
  5.         // 用两个集合来描述河两岸
  6.         List<String> here = new ArrayList<String>();
  7.         List<String> there = new ArrayList<String>();

  8.         // 初始化猫、狗、鱼在here集合中
  9.         public Test10() {
  10.                 here.add("Dog");
  11.                 here.add("cat");
  12.                 here.add("fish");
  13.         }

  14.         // 定义一个方法isSafty()判断农夫离开一岸到另一岸时,是否安全,安全的标准是狗和鱼在一起,猫被老农带走。
  15.         public boolean isSafty(List<String> list) {
  16.                 if (list.contains("dog") && list.contains("cat")
  17.                                 || list.contains("cat") && list.contains("fish")) {
  18.                         return false;
  19.                 }
  20.                 return true;
  21.         }

  22.         public void toTake() {
  23.                 // 获取集合中的第一个元素,如果该元素是狗或者鱼,则不安全,将该元素删除,
  24.                 //并重新运行toTake方法,这时该元素会被置换为最后一个元素,保证农夫带动物的随机性。
  25.                 // 如果该元素是猫,则将其带走。
  26.                 String str = here.get(0);
  27.                 here.remove(str);
  28.                 if (isSafty(here)) {
  29.                         System.out.println("1农夫带着" + str + "去往对岸,这边还剩下" + here + ",对岸有"
  30.                                         + there);
  31.                         toThere(str);
  32.                 } else {
  33.                         here.add(str);
  34.                         toTake();
  35.                 }
  36.         }

  37.         public void toThere(String s) {
  38.                 // 如果河的另一边安全,则增加带来的动物
  39.                 if (isSafty(there)) {
  40.                         there.add(s);
  41.                         //当here中元素不存在时,说明三只动物都被带过河了。
  42.                         if (here.isEmpty()) {
  43.                                 System.out.println("农夫," + there + "都被你带过来了");
  44.                                 return;
  45.                         }
  46.                         //将猫放到对面后,再回去带其他动物
  47.                         if (isSafty(there)) {
  48.                                 System.out.println("2农夫回到原点,对岸有" + there);
  49.                                 toTake();
  50.                         } else {
  51.                                 String temp = there.get(0);
  52.                                 there.remove(temp);
  53.                                 System.out.println("3农夫带着" + temp + "回到原点,这边有" + here + ",对岸有"
  54.                                                 + there);
  55.                                 here.add(temp);
  56.                                 toTake();
  57.                         }
  58.                 }
  59.                 //如果不安全,则该元素删除,重新运行toTake方法,这时该元素会被置换为最后一个元素。
  60.                 else {
  61.                         there.remove(s);
  62.                         toTake();
  63.                 }
  64.         }

  65.         public static void main(String[] args) {
  66.                 new Test10().toTake();
  67.         }
  68. }
复制代码

作者: 我为你着迷    时间: 2014-8-6 19:28
遇到这种编程题  我想我直接哭了
作者: 席杰    时间: 2014-8-6 19:55
呵呵,跟我考的一个题。
作者: 席杰    时间: 2014-8-6 19:58
掌柜的--刘饮 发表于 2014-8-4 23:47
李饶亮 老师的公开课 面对对象 猫狗鱼 过河问题,你到传智播客公开课里搜搜,很经典的讲解 ...

你好,请问怎么搜呢?我怎么找不到,我也考了这个题,我想看看老师是怎么解决的。看看我的答案跟老师思想想的一样吗?
作者: 席杰    时间: 2014-8-6 20:00
暗夜星辰 发表于 2014-8-6 19:21

这是你自己写的,还是标准答案?
作者: 席杰    时间: 2014-8-6 20:15
暗夜星辰 发表于 2014-8-6 19:21

不错,编的很好。不过我跟你的不一样,我还是分别将农民、三个动物都编程了对象。看起来没有你这种精简,你的重点在判断动物是否可以过河。学习了。
作者: 我为你着迷    时间: 2014-8-6 20:30
何磊 发表于 2014-8-5 20:52
灌水帖,鉴定完毕

亲   为什么说这个贴是灌水帖呢
作者: 朱道研    时间: 2014-8-6 21:30
这是基础测试? = =
作者: Ron    时间: 2014-8-6 21:37
暗夜星辰 发表于 2014-8-6 19:21

这个看得懂,不错
作者: /aiq玩完?/aiq    时间: 2014-8-6 21:41
善于动脑的孩纸才是好孩纸;P
作者: ソi苆僞lè袮    时间: 2014-8-6 23:14
  1. public class Test10 {

  2.         /**
  3.          * @param args
  4.          */
  5.         public static void main(String[] args) {

  6.                 // 首先创建3个集合分别代表河岸左边和河岸右边还有船
  7.                 ArrayList<String> left = new ArrayList<String>();
  8.                 ArrayList<String> right = new ArrayList<String>();
  9.                 ArrayList<String> boat = new ArrayList<String>();
  10.                 // 开始所有动物和人都在左岸
  11.                 left.add("person");
  12.                 left.add("cat");
  13.                 left.add("dog");
  14.                 left.add("fish");

  15.                 while (left.size() > 0) {
  16.                         // 判断左岸是否有老农,有的话老农上船
  17.                         if (left.contains("person")) {

  18.                                 left.remove("person");
  19.                                 boat.add("person");
  20.                                 System.out.println("老农上船");
  21.                         }
  22.                         Random r = new Random();
  23.                         // 随机带一只动物上船
  24.                         int num = r.nextInt(left.size());
  25.                         boat.add(left.get(num));
  26.                         String animal = left.remove(num);
  27.                         System.out.println(animal + "上船了");
  28.                         boat.remove(animal);
  29.                         right.add(animal);
  30.                         System.out.println(animal + "到达右岸");
  31.                         if (right.size() >= 2) {// 如果右岸有两只或者两只以上的动物进入该if语句
  32.                                 if (left.size() != 0) {// 如果此时左岸已经没有动物了,则不需要判断是否安全了,因为老农会和最后一只动物一起上岸
  33.                                         if (!isSafe(right)) {// 判断是否安全,如果不安全,进入该if代码块
  34.                                                 num = r.nextInt(right.size());// 随机从右岸带走一只动物
  35.                                                 System.out.println("将" + right.get(num) + "带回左岸");
  36.                                                 String backAnimal = right.remove(num);
  37.                                                 boat.add(backAnimal);
  38.                                                 System.out.println(backAnimal + "上船了");
  39.                                                 boat.remove(backAnimal);
  40.                                                 left.add(backAnimal);
  41.                                                 System.out.println(backAnimal + "回到左岸");
  42.                                         }
  43.                                 } else {// 左岸已经没有动物,还有一只动物和一个人在船上
  44.                                         for (int i = 0; i < boat.size(); i++) {
  45.                                                 right.add(boat.get(i));
  46.                                                 // String rightAnimal=boat.remove(i);
  47.                                                 System.out.println(boat.get(i) + "到达右岸");
  48.                                         }
  49.                                 }
  50.                         }
  51.                 }       
  52.                
  53.                         System.out.println("此时右岸有");
  54.                         for (int i = 0; i < right.size(); i++) {
  55.                                 System.out.print( right.get(i)+"\t");
  56.                         }
  57.                         System.out.println("过河成功!");
  58.         }

  59.         /**
  60.          * 判断是否和谐的方法
  61.          */
  62.         public static boolean isSafe(ArrayList<String> list) {
  63.                 boolean isSafe = true;
  64.                 // 分析知道几个动物之间只要有猫存在就不和谐
  65.                 if (list.contains("cat") && list.size() >= 2) {
  66.                         if (!list.contains("person")) {
  67.                                 isSafe = false;
  68.                         }
  69.                 }
  70.                 return isSafe;

  71.         }

  72. }
复制代码

作者: Bule丶    时间: 2014-8-6 23:49
不过去可以不
作者: Bule丶    时间: 2014-8-6 23:51
首先把猫带过去,然后回来带狗,然后过去后把猫在带回来,然后带鱼过去,然后回来带猫




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2