农民带动物过河(狗猫鱼)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">备注:这个是黑马程序员的基础测试题,</span><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(255, 0, 0); background-color: rgb(255, 255, 255);">代码都是我自己亲手写的</span><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">,跟其他人的不同,大家可以来看看,给给建议什么的。。。</span>

如需转载麻烦表明出处,附上此贴链接,谢谢!


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

代码:
import java.util.ArrayList;
import java.util.List;


public class AnimalCrossRiver {
	private Bank srcBank;
	private Bank destBank;
	
	public AnimalCrossRiver(Bank srcBank, Bank destBank) {
		this.srcBank = srcBank;
		this.destBank = destBank;
	}
	
	public Bank getSrcBank() {
		return srcBank;
	}

	public Bank getDestBank() {
		return destBank;
	}

	public static void main(String[] args) {
	
		Bank srcBank = new Bank(initsrcBankAnimals(),true);
		Bank destBank = new Bank(new ArrayList<Animal>(), false);
		AnimalCrossRiver acr = new AnimalCrossRiver(srcBank, destBank);
		acr.riverCrossing();
	}	
	public static List<Animal> initsrcBankAnimals(){
		List<Animal> srcBankAnimals = new ArrayList<Animal>();
		srcBankAnimals.add(new Animal("狗",null));
		srcBankAnimals.add(new Animal("猫","狗"));
		srcBankAnimals.add(new Animal("鱼","猫"));		
		return srcBankAnimals;
	}
	
	private void riverCrossing(){		
		Bank srcBank = this.getSrcBank();
		Bank destBank = this.getDestBank();
		Animal temp1 = null;
		Animal temp2 = null;
		while(true){			
			temp1 = srcBank.removeAni();//函数中把此岸被设置没人		
			//对岸增加动物,自动设置对岸有人
			destBank.addAni(temp1);	
			//打印信息
			System.out.println("河岸----------------->对岸(人在对岸)");
			System.out.println("河岸上动物个数:"+srcBank.getBankAnimals().size());
			System.out.print(srcBank.isHasHuman()? "有人:":"没人:"+" ");
			for(Animal animal:srcBank.getBankAnimals()){
				System.out.print(animal.getName()+" ");
			}
			System.out.println();
			System.out.println("对岸上动物个数:"+destBank.getBankAnimals().size());
			System.out.print(destBank.isHasHuman()? "有人:":"没人:"+" ");
			for(Animal animal:destBank.getBankAnimals()){
				System.out.print(animal.getName()+" ");
			}
			System.out.println();			
			if(destBank.getBankAnimals().size() == 3){ //对岸动物数量达到三个,结束
				System.out.println();
				System.out.println("-----全部通过河岸-----");
				break;
			}
			
			/****如果从对岸离开后对岸不安全,带走一个动物到河岸****/
			if(!destBank.noHumanisSafe()){
				temp2 = destBank.removeAni();				
				srcBank.addAni(temp2);		//把从对岸带回来的动物添加到河岸,设置有人
				//打印信息
				System.out.println();
				System.out.println("对岸----------------->河岸()人在河岸");
				System.out.println("河岸上动物个数:"+srcBank.getBankAnimals().size());
				System.out.print(srcBank.isHasHuman()? "有人:":"没人:"+" ");
				for(Animal animal:srcBank.getBankAnimals()){
					System.out.print(animal.getName()+" ");
				}
				System.out.println();
				System.out.println("对岸上动物个数:"+destBank.getBankAnimals().size());
				System.out.print(destBank.isHasHuman()? "有人:":"没人:"+" ");
				for(Animal animal:destBank.getBankAnimals()){
					System.out.print(animal.getName()+" ");
				}
				System.out.println();
			}
			System.out.println();
			
			/*---测试用---*/
			/* int i=1;
			 * i++;
			 * if(i == 5){
			 * break;}*/
		}
	}
}

//Bank类
class Bank{
	private List<Animal> bankAnimals;
	private boolean hasHuman;
	private boolean isSafe;
	
	//构造函数
	public Bank(List<Animal> bankAnimals, boolean hasHuman) {
		this.bankAnimals = bankAnimals;
		this.hasHuman = hasHuman;
	}	
	//获取河岸的动物
	public List<Animal> getBankAnimals() {
		return bankAnimals;
	}
	//河岸是否有人
	public boolean isHasHuman() {
		return hasHuman;
	}
	public void setHasHuman(boolean hasHuman) {
		this.hasHuman = hasHuman;
	}
	//添加动物,自动设置对岸有人
	public void addAni(Animal animal){
		this.setHasHuman(true);
		this.getBankAnimals().add(animal);
	}
	//删除动物	
	public Animal removeAni(){
		this.setHasHuman(false);
		List<Animal> animals = this.getBankAnimals();
		Animal temp  = null;
		for(int i=0;i<animals.size();i++){
			temp = animals.get(0);
			animals.remove(0);
			if(this.noHumanisSafe()){ //执行完此岸被设置没人
				return temp;
			}else{
				animals.add(temp);
			}
		}
		return null;
	}
	//如果人离开了是否安全,执行完此岸被设置没人
	public boolean noHumanisSafe(){
		this.setHasHuman(false);
		if(this.bankAnimals.size() == 3){
			return false;
		}
		if(this.bankAnimals.size() == 2){
			if(this.bankAnimals.get(0).getName() == this.bankAnimals.get(1).getNaturalEnemy()
				||this.bankAnimals.get(1).getName() == this.bankAnimals.get(0).getNaturalEnemy()){
				return false;
			}
		}
		return true;
	}		
}
//动物类
class Animal{
	// 动物名称
	private String name;
	// 动物的天敌
	private String naturalEnemy;				
	public Animal(String name, String naturalEnemy) {
		this.name = name;
		this.naturalEnemy = naturalEnemy;
	}
	public String getName() {
		return name;
	}
	public String getNaturalEnemy() {
		return naturalEnemy;
	}	
}

代码经过测试,没有问题。下面是截图:


谢谢阅读,欢迎交流!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值