黑马程序员——猫、狗、鱼过河问题解决办法

来源:互联网 发布:主持人音效易语言源码 编辑:程序博客网 时间:2024/04/27 23:34

代码实现:

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>、期待与您交流! ----------



0 0