黑马程序员技术交流社区

标题: 请教大家一个问题 [打印本页]

作者: ソi苆僞lè袮    时间: 2014-6-29 00:23
标题: 请教大家一个问题
一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题,这题怎么理解?不懂什么意思

作者: 面向大众    时间: 2014-6-29 00:30
第一次把猫带过来,第二次把鱼拉过来把猫带回去,然后第三次把狗带过来,然后什么都不带回去,第四次把猫带过来。
作者: 杨庆雷    时间: 2014-6-29 00:38
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Random;

  4. /**
  5. *
  6. * @author 刘望望
  7. *        10、一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  8. *        当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。
  9. *        编程解决猫狗鱼过河问题。
  10. */
  11. public class Test10
  12. {
  13.         List<String> left = new ArrayList<String>(); //表示河正岸
  14.         List<String> right = new ArrayList<String>();  //表示河对岸
  15.        
  16.         public Test10() //初始化,老农、猫、狗、鱼都在河正岸准备渡河
  17.         {
  18.                 left.add("person");
  19.                 left.add("fish");
  20.                 left.add("dog");
  21.                 left.add("cat");
  22.         }
  23.        
  24.         //渡河方法,解决思路:猫不能和其他动物单独在一起
  25.         //第一步:老农带着猫渡河
  26.         //第二步:把猫放在对岸,老农自己回去接狗和鱼
  27.         //第三步:老农带着狗或者鱼渡河,假设带狗
  28.         //第四步:老农把猫带回去,把狗自己放在河对岸
  29.         //第五步:老农把猫放在和正岸,带着鱼一起渡河
  30.         //第六步:老农自己回去
  31.         //第七步:老农带着猫渡河,这样他们就都过去了,也不会发生冲突
  32.         public void cross()
  33.         {
  34.                 while(left.size() > 1)
  35.                 {
  36.                         left.remove("person");
  37.                         Random random = new Random(); //老农随机带走一直动物
  38.                         int index = random.nextInt(left.size());
  39.                         if(index == left.size() - 1 && left.size() > 1) //为防止老农带走刚带回来的动物
  40.                         {
  41.                                 left.add("person");
  42.                                 continue;
  43.                         }
  44.                         String s = left.get(index);
  45.                         left.remove(s);
  46.                         if(isSafe(left)) //如果老农带走该动物后,正岸没有冲突,则带走该动物
  47.                         {
  48.                                 right.add("person"); // 该动物和老农到达对岸
  49.                                 right.add(s);
  50.                                 System.out.println("老农带" + s + "到对岸");
  51.                                
  52.                                 if(right.size() == 4) //当老农和动物全部到达对岸,则渡河完成
  53.                                 {
  54.                                         break;
  55.                                 }
  56.                                
  57.                                 right.remove("person"); //老农准备返回
  58.                                 if(isSafe(right)) //如果老农自己返回,对岸不会发生冲突,则老农自己返回
  59.                                 {
  60.                                         left.add("person"); //老农返回正岸
  61.                                         System.out.println("老农单独返回");
  62.                                 }
  63.                                 else //否则,老农带着一只动物一起返回
  64.                                 {
  65.                                         String s2 = right.get(random.nextInt(right.size()));
  66.                                         while(s2.equals(s)) //如果老农要带走的动物是刚带来的那只,则换一只带走
  67.                                         {
  68.                                                 s2 = right.get(random.nextInt(right.size()));
  69.                                         }
  70.                                         right.remove(s2);
  71.                                         left.add(s2); //老农和一只动物返回正岸
  72.                                         left.add("person");
  73.                                         System.out.println("老农带着" + s2 + "返回");
  74.                                 }
  75.                         }
  76.                         else //如果老农带走一只动物后,正岸发生冲突,则放下该动物
  77.                         {
  78.                                 left.add(s);
  79.                                 left.add("person");
  80.                         }
  81.                 }
  82.                 System.out.println("老农和所有的宠物都成功渡河");
  83.         }
  84.        
  85.         //判断某一边是否和谐
  86.         public boolean isSafe(List<String> list)
  87.         {
  88.                 boolean b = true;
  89.                
  90.                 //如果某一边没有人,猫单独和其他动物在一起,则不和谐
  91.                 if(list.size() > 1 && list.contains("cat") && !list.contains("person"))
  92.                 {
  93.                         b = false;
  94.                 }
  95.                
  96.                 return b;
  97.         }
  98.        
  99.         public static void main(String[] args)
  100.         {
  101.                 Test10 t10 = new Test10();
  102.                 t10.cross();
  103.         }
  104. }
复制代码
   转载自 刘望望 同学的回帖

作者: Bugist    时间: 2014-6-29 01:09
这是黑马入学考试的一道题,很有难度的!
作者: ソi苆僞lè袮    时间: 2014-6-29 02:02
杨庆雷 发表于 2014-6-29 00:38
转载自 刘望望 同学的回帖

哇塞,答案都发来了不会有什么问题吧,就是想问问这题考的什么知识点,谢谢了  辛苦额
作者: ソi苆僞lè袮    时间: 2014-6-29 02:03
面向大众 发表于 2014-6-29 00:30
第一次把猫带过来,第二次把鱼拉过来把猫带回去,然后第三次把狗带过来,然后什么都不带回去,第四次把猫带 ...

谢谢,了解了
作者: dispensable    时间: 2014-6-29 02:37
……好厉害……学习了
作者: lijinhe    时间: 2014-6-29 09:12
学习一下!

作者: huocaoxi    时间: 2014-8-9 06:17
哇,不错,好复杂,参考参考
作者: niushicha    时间: 2014-8-9 14:15
这到题好像我在哪里见过哦!
作者: wfaly    时间: 2014-8-19 09:02
学习学习 参考参考
作者: 李永佳    时间: 2015-5-13 10:47
杨庆雷 发表于 2014-6-29 00:38
转载自 刘望望 同学的回帖

第40行,不明白这句话是什么意思,left.size() > 1,能给解释一下吗?谢谢了。还有这句index == left.size() - 1怎么判断出来的不是刚带过来的动物。感谢
作者: zjingwen    时间: 2015-9-26 10:36
不错啊。看看




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