黑马程序员技术交流社区
标题:
java测试题猫狗鱼过河
[打印本页]
作者:
Sylvanas
时间:
2015-3-31 18:51
标题:
java测试题猫狗鱼过河
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);
}
}
复制代码
想了一个晚上,终于搞出来了,但是感觉拓展性不够,而且判断条件好别扭的说。
作者:
林吉前
时间:
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