import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,
* 当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
*
* 思路:
* 1.猫不能和其他两种动物在一起
* 2.先把猫带到对岸
* 农夫自己回来
* 农夫把狗或鱼带到对岸
* 农夫把猫带回来
* 农夫再把剩下的动物带到对岸
* 农夫自己回来
* 农夫把猫带到对岸
* @author xiajie
*
*/
public class Test10 {
//定义猫狗鱼变量
private static final String cat = " 猫 ";
private static final String dog = " 狗 ";
private static final String fish = " 鱼 ";
private static final String farmer = " 农夫 ";
private static List<String> left = new ArrayList<String>();//左岸的集合
private static List<String> right = new ArrayList<String>();//右岸的集合
//在无参构造方法中将猫狗鱼添加到left集合中去
public Test10(){
left.add(fish);
left.add(dog);
left.add(farmer);
left.add(cat);
}
public static void main(String[] args) {
new Test10().cross();//实例化本来对象并调用过河方法
}
public static void cross(){
//当左岸有动物就一直继续
while(left.size() > 1){
left.remove(farmer);//农夫一定要带着一个动物渡河
Random random = new Random();//老农随机带走一直动物
int index = random.nextInt(left.size());//产生的随机数不能大于总个数,即产生了一个 不大于left.size的数字
if(index == left.size()-1 && left.size()>1){//为防止老农带走刚带回来的动物,因为这个List中存储数据是先进先出的所以,不能是最后的一个数,因为最后一个数表示的是农夫刚带回来动物,最后加如leftList中的
left.add(farmer);
continue;//continue 跳过当前循环体continue后面的代码,继续执行下一个循环
}
String animal = left.get(index);//随机产生的动物
left.remove(animal);//带走随机产生的一个动物
if(isFriendly(left)){//如果老农带走该动物后,正岸没有冲突,则带走该动物
right.add(farmer);//老农和动物到岸,加入Left集合中区
right.add(animal);
System.out.println("老农带着"+animal+"到了对岸");
if(right.size() == 4){ //当老农和动物全部到达对岸,则渡河完成
break;//break 跳出当前循环体
}
right.remove(farmer);//老农返回
if(isFriendly(right)){//如果老农独自返回右岸和谐,则让老农独自返回
left.add(farmer);
System.out.println("老农独自返回");
}else{//否则老农要随机带一直动物回来
String animal2 = right.get(random.nextInt(right.size()));
while(animal2.equals(animal)){
animal2 = right.get(random.nextInt(right.size()));
}
right.remove(animal2);
left.add(farmer);
left.add(animal2);//老农带着一个动物返回
System.out.println("老农带着"+animal2+"返回");
}
}else{//如果老农带走该动物后,正岸发生冲突,则放回动物,重新加入Left集合中去
left.add(animal);
left.add(farmer);
}
}
System.out.println("所有动物都成功过河了,完成任务!!!");
}
//用来判断两种动物在一起是不是和谐
public static boolean isFriendly(List<String> list){
boolean flag ;
//如果猫和其他的在一起,而没有人则不和谐
if(list.size() >1 && list.contains(cat) && !list.contains(farmer)){
flag = false ;
}else{
flag = true ;
}
return flag;
}
}
注意:一定要让程序根据题目的条件自己选择执行,不能按照自己的想法去指定程序运行的步骤。
输出结果:
老农带着 猫 到了对岸
老农独自返回
老农带着 鱼 到了对岸
老农带着 猫 返回
老农带着 狗 到了对岸
老农独自返回
老农带着 猫 到了对岸
所有动物都成功过河了,完成任务!!!