- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Random;
- /*一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
- 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。*/
- public class Test10 {
- /**
- * 解题思路
- * 把出发岸边,目的岸边,船都看做一个容器,容器中有动物和农夫
- * 把农夫和动物用map产生与数值对应的关系,用以生成判断条件
- * @param args
- */
- public static void main(String[] args) {
- while(true)
- new Test10().move();//创建一个无限循环,在方法中执行终止
-
- }
- public void move()
- {
- Map<String, Integer> solution=new HashMap<String, Integer>();
- /*创建一个map,其键为要运动的对象名称
- * 值为对应数值,用以将名称对应称数字判断
- * 为了让任意两数之和都不同,数值设为2的n次方
- */
- solution.put("fish",1);
- solution.put("cat", 2);
- solution.put("dog",4);
- solution.put("farmer",8);
- Random rand=new Random(41);//创建一个随机类,
- String str=new String("fish,cat,dog,farmer");//创建包含了所有对象的容器将其设为初始的出发一侧
- String [] strlist=str.split(",");
- List<String> origSide=new ArrayList<String>();
- for(int p=0;p<strlist.length;p++)
- origSide.add(strlist[p]);
- /*
- * 两个空容器,分别是运输工具船和对岸
- */
- List<String> boat=new ArrayList<String>();
- List<String> destSide=new ArrayList<String>();
- System.out.println("初始状态:\n 出发岸边有 :farmer,dog,cat,fish");
- int j=1;//计步器
- outer://如果第一步条件判断为假,从这里重新开始循环
- while(!origSide.isEmpty())//不为空则循环
- {
- origSide.remove("farmer");//移除farmer
- if(origSide.isEmpty())
- break;//如果移除farmer后容器为空,则跳出该循环
- String first=origSide.get(rand.nextInt(origSide.size()));//从溢出了famer后的容器中的对象中随机挑取一个
- /*
- * boat容器中添加
- */
- boat.add(first);
- boat.add("farmer");
- System.out.println("第"+j+"步:把"+first+"移到船上,带到对岸");
- j++;
- origSide.remove(first);//出发一侧移除随机选择的一个对象
- /*
- * 下面是判断是否执行第二步的条件,根据题意规则
- */
- int sum=0;
- for(int o=0;o<origSide.size();o++)
- sum+=solution.get(origSide.get(o));
- if(sum==3||sum==6||sum==7)
- continue outer; //直接跳至outer
-
-
- if(!boat.isEmpty())//其实在这一步boat肯定不为空
- /*
- * 卸载boat,移到对岸
- */
- {
- boat.remove("farmer");
- destSide.add(boat.get(0));
- destSide.add("farmer");
- boat.remove(0);
- }
- int size=destSide.size();//进入第三步,判断对岸容器大小
- if(size==2)
- {
- /*
- * 在对岸大小为2时,即农夫和一个动物,把farmer和动物都移除就毫无意义了,所以只移除farmer
- */
- boat.add("farmer");
- destSide.remove("farmer");
- boat.remove("farmer");
- origSide.add("farmer");
- System.out.println("第"+j+"步:不从对岸带回任何东西");
- j++;
- }
-
- else if (size==3)
- {
- //判断对岸大小为3时的情形
- int sum2=0;
- destSide.remove("farmer");
- for(int o=0;o<destSide.size();o++)
- {
- sum2+=solution.get(destSide.get(o));
- }
- //情况1,移除农夫后,剩下两动物有冲突关系,需要带走一个
- if(sum2==3||sum2==6)
- {
- boat.add("farmer");
- String second=destSide.get(rand.nextInt(2));
- boat.add(second);
- boat.remove(second);
- destSide.remove(second);
- origSide.add("farmer");
- origSide.add(second);
- System.out.println("第"+j+"步:把"+second+"移到船上,带回来");
- j++;
- }
- else //情况2,没有冲突关系,则不需要带走剩下的动物
- {
- destSide.remove("farmer");
- boat.add("farmer");
- boat.remove("farmer");
- origSide.add("farmer");
- System.out.println("第"+j+"步:不从对岸带回任何东西");
- j++;
- }
- }
- else //当对岸大小为4时,意味着任务已经完成,退出整个循环
- break;
- }
- System.out.println("任务完成");
- System.exit(0);
- }
- }
复制代码 想了一个晚上,终于搞出来了,但是感觉拓展性不够,而且判断条件好别扭的说。
|
|