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

代码实现:

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



猜你喜欢

转载自blog.csdn.net/a1106900429/article/details/40024919