A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 止询初衷 中级黑马   /  2014-8-4 22:16  /  4153 人查看  /  25 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

          一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
          当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。 编程解决猫狗鱼过河问题。
       

25 个回复

正序浏览
首先把猫带过去,然后回来带狗,然后过去后把猫在带回来,然后带鱼过去,然后回来带猫
回复 使用道具 举报
不过去可以不
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
善于动脑的孩纸才是好孩纸;P
回复 使用道具 举报
这是基础测试? = =
回复 使用道具 举报
何磊 发表于 2014-8-5 20:52
灌水帖,鉴定完毕

亲   为什么说这个贴是灌水帖呢
回复 使用道具 举报

不错,编的很好。不过我跟你的不一样,我还是分别将农民、三个动物都编程了对象。看起来没有你这种精简,你的重点在判断动物是否可以过河。学习了。
回复 使用道具 举报

这是你自己写的,还是标准答案?
回复 使用道具 举报
掌柜的--刘饮 发表于 2014-8-4 23:47
李饶亮 老师的公开课 面对对象 猫狗鱼 过河问题,你到传智播客公开课里搜搜,很经典的讲解 ...

你好,请问怎么搜呢?我怎么找不到,我也考了这个题,我想看看老师是怎么解决的。看看我的答案跟老师思想想的一样吗?
回复 使用道具 举报
呵呵,跟我考的一个题。
回复 使用道具 举报
遇到这种编程题  我想我直接哭了
回复 使用道具 举报
  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. }
复制代码
回复 使用道具 举报
大致思路:

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

else continue;
回复 使用道具 举报
有意思的问题,哈哈。学习一下。
回复 使用道具 举报
学习一下
回复 使用道具 举报
学习一下
回复 使用道具 举报
学习一下。。。。。。。。
回复 使用道具 举报
灌水帖,鉴定完毕
回复 使用道具 举报
流程二  技术分就这么多了   
回复 使用道具 举报
这么恶心的题 copy答案
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马