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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Sylvanas 中级黑马   /  2015-3-31 18:51  /  1030 人查看  /  15 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码
想了一个晚上,终于搞出来了,但是感觉拓展性不够,而且判断条件好别扭的说。

15 个回复

倒序浏览
{:3_52:}这题好可怕
回复 使用道具 举报

我已开始也是这么想,但是后来思路来了,就根本停不下来啊。
回复 使用道具 举报
我表示还是回去慢慢的看视频吧。
回复 使用道具 举报
a1301155262 来自手机 中级黑马 2015-3-31 20:59:49
报纸
围观一下
回复 使用道具 举报
还是继续看视频
回复 使用道具 举报
对于现在的我来说还看不懂,不过还是赞一个!!!!!!!!
回复 使用道具 举报
确实难
回复 使用道具 举报
值得学习。
回复 使用道具 举报
bztf 中级黑马 2015-3-31 21:49:06
10#
真的很变态,有思路就简单多了
回复 使用道具 举报
我表示还是回去慢慢的看视频吧。
回复 使用道具 举报
这题好难啦
回复 使用道具 举报
跟楼主一比,感觉差距好大。。。。
回复 使用道具 举报
这题真强。。。学习了。
回复 使用道具 举报
真的很变态,有思路就简单多了
回复 使用道具 举报
先拿来参考研究了~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马