黑马程序员技术交流社区
标题:
关于农夫过河问题,老夫考虑了一天时间,只为纯程序判断,代码如下,忘指点!
[打印本页]
作者:
唐王潮
时间:
2014-10-21 18:19
标题:
关于农夫过河问题,老夫考虑了一天时间,只为纯程序判断,代码如下,忘指点!
大家看看有什么更简便的方法没有,不加入个人主观思路,纯粹让程序判断。
package com.itheima;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test9 {
/*
*
* 思路:
* 1.定义一个方法用来判断岸边是否和谐
* 2.第一次过河,老农随机带走一个,判断岸边是否和谐,不和谐把带走的放回去
* 3.老农从对岸返回
* 4.老农从正岸随机带走一个到对岸,判断对岸是否和谐,不和谐则随机带走一个到正岸,判断正岸是否和谐,
* 不和谐再随机从正岸带走一个到对岸,无限循环直到对岸和谐。
* 5.老农从对岸返回正岸
* 6.老农从正岸将最后一只动物带到对岸,至此全部过河。
*/
public static void main(String[] args) {
//此岸
List<String> river = new ArrayList<String>();
//初始化成员
river.add("猫");
river.add("狗");
river.add("鱼");
//对岸
List<String> otherSide = new ArrayList<String>();
//开始渡河
while(otherSide.size()!=3){
//第一次随机带走
Random ran = new Random();
int r = ran.nextInt(3);//随机获取0-2角标
String aim1 = river.get(r);//获取随机角标对应的此岸动物
river.remove(r);//带随机角标对应的动物过河
//如果此岸和谐
if(getTrue(river)){
System.out.println("———传说很久很久以前———");
System.out.println("1.农夫带["+aim1+"]>>对岸");
System.out.println("2.农夫回到此<<岸");
//将随机带走的动物放到对岸
otherSide.add(aim1);
//创建2个临时集合用于存储动物,以便取出正确方案的动物
List<String> temp1 = new ArrayList<String>();
List<String> temp2 = new ArrayList<String>();
//农夫回到此岸第二次随机带走
while(otherSide.size()!=3){
r = ran.nextInt(2);//随机获取0-1角标
String aim2 = river.get(r);//获取随机角标对应的此岸动物
river.remove(r);//带随机角标对应的动物过河
otherSide.add(aim2);//将随机带走的动物放到对岸
temp1.add(aim2);
//判断对岸是否和谐
if(getTrue(otherSide)){
//如果对岸和谐,那么temp1最后一个元素对应的一定是鱼或狗
String aim4 = temp1.get(temp1.size()-1);
System.out.println("3.农夫带["+aim4+"]到对>>岸");
String aim5 = temp2.get(temp2.size()-1);
System.out.println("4.农夫带【"+aim5+"】回到此<<岸");
//如果对岸和谐,且狗已经被带过去了,那么这里带走的一定是鱼,反之亦然。
if(aim4.equals("狗")){
aim4 = "鱼";
System.out.println("5.农夫带["+aim4+"]到对>>岸");
}else{
aim4 = "狗";
System.out.println("5.农夫带["+aim4+"]到对>>岸");
}
System.out.println("6.农夫回到此<<岸");
otherSide.addAll(river);
System.out.println("7.农夫带"+river+"到对>>岸");
System.out.println("——————大结局———————\r{老农泪流满面的看着一群完\r好无损的小动物,开开心心\r的相亲去了}");
}else{
//如果对岸不和谐
r = ran.nextInt(2);//随机获取0-1角标
String aim3 = otherSide.get(r);//获取随机角标对应的对岸动物
otherSide.remove(r);//将随机角标对应的对岸动物带回此岸
river.add(aim3);//将随机角标对应的对岸动物放到此岸
temp2.add(aim3);//如果对岸和谐,那么temp2中最后一个元素一定是猫
}
}
//如果此岸不和谐
}else{
river.add(aim1);
}
}
}
//判断岸边是否和谐
public static boolean getTrue(List<String> list) {
if((list.contains("猫")&&list.contains("狗"))||(list.contains("猫")&&list.contains("鱼"))){
return false;
}else{
return true;
}
}
}
复制代码
作者:
zhengzhaozhao
时间:
2014-10-21 18:29
非常牛B
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2