一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。

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;
	}
}


注意:一定要让程序根据题目的条件自己选择执行,不能按照自己的想法去指定程序运行的步骤。

输出结果:

老农带着 猫 到了对岸
老农独自返回
老农带着 鱼 到了对岸
老农带着 猫 返回
老农带着 狗 到了对岸
老农独自返回
老农带着 猫 到了对岸
所有动物都成功过河了,完成任务!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值