黑马程序员技术交流社区

标题: java测试题猫狗鱼过河 [打印本页]

作者: Sylvanas    时间: 2015-3-31 18:51
标题: java测试题猫狗鱼过河
  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Random;

  6. /*一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  7. 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。*/
  8. public class Test10 {
  9. /**
  10. * 解题思路
  11. * 把出发岸边,目的岸边,船都看做一个容器,容器中有动物和农夫
  12. * 把农夫和动物用map产生与数值对应的关系,用以生成判断条件
  13. * @param args
  14. */
  15.         public static void main(String[] args) {
  16.                 while(true)
  17.                 new Test10().move();//创建一个无限循环,在方法中执行终止
  18.                
  19.         }
  20.         public void move()
  21.         {
  22.                 Map<String, Integer> solution=new HashMap<String, Integer>();
  23.                 /*创建一个map,其键为要运动的对象名称
  24.                  * 值为对应数值,用以将名称对应称数字判断
  25.                  * 为了让任意两数之和都不同,数值设为2的n次方
  26.                  */
  27.                 solution.put("fish",1);
  28.                 solution.put("cat", 2);
  29.                 solution.put("dog",4);
  30.                 solution.put("farmer",8);
  31.                 Random rand=new Random(41);//创建一个随机类,
  32.                 String str=new String("fish,cat,dog,farmer");//创建包含了所有对象的容器将其设为初始的出发一侧
  33.                 String [] strlist=str.split(",");
  34.                 List<String> origSide=new ArrayList<String>();
  35.                 for(int p=0;p<strlist.length;p++)
  36.                 origSide.add(strlist[p]);
  37.                 /*
  38.                  * 两个空容器,分别是运输工具船和对岸
  39.                  */
  40.                 List<String> boat=new ArrayList<String>();
  41.                 List<String> destSide=new ArrayList<String>();
  42.                 System.out.println("初始状态:\n 出发岸边有 :farmer,dog,cat,fish");
  43.                 int j=1;//计步器
  44.                 outer://如果第一步条件判断为假,从这里重新开始循环
  45.                 while(!origSide.isEmpty())//不为空则循环
  46.                 {       
  47.                         origSide.remove("farmer");//移除farmer
  48.                         if(origSide.isEmpty())
  49.                         break;//如果移除farmer后容器为空,则跳出该循环
  50.                         String first=origSide.get(rand.nextInt(origSide.size()));//从溢出了famer后的容器中的对象中随机挑取一个
  51.                         /*
  52.                          * boat容器中添加
  53.                          */
  54.                         boat.add(first);
  55.                         boat.add("farmer");
  56.                         System.out.println("第"+j+"步:把"+first+"移到船上,带到对岸");
  57.                         j++;
  58.                         origSide.remove(first);//出发一侧移除随机选择的一个对象
  59.                         /*
  60.                          * 下面是判断是否执行第二步的条件,根据题意规则
  61.                          */
  62.                         int sum=0;
  63.                         for(int o=0;o<origSide.size();o++)
  64.                         sum+=solution.get(origSide.get(o));
  65.                         if(sum==3||sum==6||sum==7)
  66.                         continue outer;        //直接跳至outer
  67.                        
  68.                        
  69.                         if(!boat.isEmpty())//其实在这一步boat肯定不为空
  70.                                 /*
  71.                                  * 卸载boat,移到对岸
  72.                                  */
  73.                                         {
  74.                                         boat.remove("farmer");
  75.                                         destSide.add(boat.get(0));
  76.                                         destSide.add("farmer");
  77.                                         boat.remove(0);
  78.                                         }
  79.                                 int size=destSide.size();//进入第三步,判断对岸容器大小       
  80.                                 if(size==2)
  81.                                 {
  82.                                         /*
  83.                                          * 在对岸大小为2时,即农夫和一个动物,把farmer和动物都移除就毫无意义了,所以只移除farmer
  84.                                          */
  85.                                         boat.add("farmer");
  86.                                         destSide.remove("farmer");
  87.                                         boat.remove("farmer");
  88.                                         origSide.add("farmer");
  89.                                         System.out.println("第"+j+"步:不从对岸带回任何东西");
  90.                                         j++;
  91.                                 }
  92.                                
  93.                                 else if (size==3)
  94.                                 {
  95.                                         //判断对岸大小为3时的情形
  96.                                         int sum2=0;
  97.                                         destSide.remove("farmer");
  98.                                         for(int o=0;o<destSide.size();o++)
  99.                                         {
  100.                                         sum2+=solution.get(destSide.get(o));
  101.                                         }
  102.                                         //情况1,移除农夫后,剩下两动物有冲突关系,需要带走一个
  103.                                         if(sum2==3||sum2==6)
  104.                                                 {
  105.                                                         boat.add("farmer");
  106.                                                         String second=destSide.get(rand.nextInt(2));
  107.                                                         boat.add(second);
  108.                                                         boat.remove(second);
  109.                                                         destSide.remove(second);
  110.                                                         origSide.add("farmer");
  111.                                                         origSide.add(second);
  112.                                                         System.out.println("第"+j+"步:把"+second+"移到船上,带回来");
  113.                                                         j++;
  114.                                                 }
  115.                                                 else //情况2,没有冲突关系,则不需要带走剩下的动物
  116.                                                 {
  117.                                                         destSide.remove("farmer");
  118.                                                         boat.add("farmer");
  119.                                                         boat.remove("farmer");
  120.                                                         origSide.add("farmer");
  121.                                                         System.out.println("第"+j+"步:不从对岸带回任何东西");
  122.                                                         j++;
  123.                                                 }
  124.                                         }
  125.                                 else //当对岸大小为4时,意味着任务已经完成,退出整个循环
  126.                                         break;
  127.                 }
  128.                 System.out.println("任务完成");
  129.                 System.exit(0);
  130.         }
  131. }
复制代码
想了一个晚上,终于搞出来了,但是感觉拓展性不够,而且判断条件好别扭的说。

作者: 林吉前    时间: 2015-3-31 19:05
{:3_52:}这题好可怕
作者: Sylvanas    时间: 2015-3-31 19:08
林吉前 发表于 2015-3-31 19:05
这题好可怕

我已开始也是这么想,但是后来思路来了,就根本停不下来啊。
作者: storer    时间: 2015-3-31 19:14
我表示还是回去慢慢的看视频吧。
作者: a1301155262    时间: 2015-3-31 20:59
围观一下
作者: Fruious    时间: 2015-3-31 21:02
还是继续看视频
作者: 小小的黑马    时间: 2015-3-31 21:15
对于现在的我来说还看不懂,不过还是赞一个!!!!!!!!
作者: 菜鸟小A    时间: 2015-3-31 21:32
确实难

作者: leonard    时间: 2015-3-31 21:35
值得学习。
作者: bztf    时间: 2015-3-31 21:49
真的很变态,有思路就简单多了
作者: 丿天邪    时间: 2015-3-31 21:55
我表示还是回去慢慢的看视频吧。
作者: 466273082    时间: 2015-3-31 23:04
这题好难啦
作者: 关山明月    时间: 2015-3-31 23:15
跟楼主一比,感觉差距好大。。。。
作者: natsu647    时间: 2015-3-31 23:17
这题真强。。。学习了。
作者: jiandonn    时间: 2015-3-31 23:54
真的很变态,有思路就简单多了
作者: thoris    时间: 2015-4-1 00:24
先拿来参考研究了~




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