代码实现:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/*
* 第十题:一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
* 当老农 不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生
* 这种问题。编程解决猫狗鱼过河问题。
*
* 解题思路: 由于他们三只动物狗、猫、鱼存在着狗咬猫、猫吃鱼的关系,我把他们想成一
* 条链:狗-->猫-->鱼,其中键尾动物对箭头动物有危害。所以从图中关系可以知道只要先拿走
* 猫到对岸,然后从鱼和狗中随便拿一种到对岸,再把对岸的猫拿到这边,再把这边岸上除猫以外
* 的动物拿到对面,最后回来把猫带回对岸。简单描述就是:带猫到过去, 带狗或鱼其中之一过去,
* 带猫过来, 带狗和鱼其中之一过去, 最后把猫带过去。
* 代码实现方式:创建两个List集合,分别存储左岸和右岸当前的动物,在过河的时候
* 用一个递归函数来实现,当递归到左岸没有动物或者是右岸有三个动物时就表示过河完成。
* */
public class Test10 {
//创建一个存储左岸动物的集合
static List<String> leftSide = new ArrayList<String>();
//创建一个存储右岸动物的集合
static List<String> rightSide = new ArrayList<String>();
public static void main(String[] args) {
//初始状态猫、狗、鱼都在左岸
leftSide.add("cat");
leftSide.add("dog");
leftSide.add("fish");
//过河函数
takeRiver(null);
}
//过河函数,其中参数表示上一次过河带来的动物,如果上一次过河没有带动物值为空
public static void takeRiver(String str){
//判断如果左岸为空或者右岸有猫狗鱼时过河完成
if(leftSide.size()==0 || rightSide.size()==3){
System.out.println("过河完成");
return ;
}
int i = new Random().nextInt(leftSide.size());
//为了避免这次过河所带的动物是上一次过河带过来的动物
if(str != null){
while(leftSide.get(i).equals(str)){
i = new Random().nextInt(leftSide.size());
}
}
String animal = leftSide.get(i);
leftSide.remove(animal);
//判断左岸是否有危险
if(judge(leftSide)){
System.out.println("把 " + animal + " 从左岸带到了右岸 ");
rightSide.add(animal);
//判断如果右岸有猫狗鱼时过河完成
if(rightSide.size()==3){
//for(String s : )
System.out.println("过河完成");
return ;
}
if(judge(rightSide)){
//右岸没有危险, 直接过河不用带动物过河
takeRiver(null);
}else{//如果右岸存在危险则带一个动物过去左岸
int k = new Random().nextInt(rightSide.size());
//为了避免这次过河所带的动物是上一次过河带过来的动物
while(rightSide.get(k).equals(animal)){
k = new Random().nextInt(rightSide.size());
}
String animal0 = rightSide.get(k);
rightSide.remove(animal0);
leftSide.add(animal0);
System.out.println("把 " + animal0 + " 从右岸带到了左岸 ");
takeRiver(animal0);
}
}else{ //如果带走左岸动物后,左岸出现危险则另外选一个动物过河
leftSide.add(animal);
takeRiver(null);
}
}
//判断是否有危险
public static boolean judge(List<String> list){
if(list.contains("cat") && list.contains("fish")){
return false;
}else if(list.contains("dog") && list.contains("cat")){
return false;
}
return true;
}
}
<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------