package com.itheima;
import java.util.ArrayList;
/**
* 第10题: 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
* 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
*
* */
public class Test10 {
public static void main(String[] args) {
//存放河岸A(起始位置)现有动物
ArrayList thisLan = new ArrayList<String>();
//存放河岸B(起始位置)现有动物
ArrayList thatLan = new ArrayList<String>();
//添加动物狗
thisLan.add("猫");
//添加动物猫
thisLan.add("鱼");
//添加动物鱼
thisLan.add("狗");
//老农类,实现所以功能
Fammer fammer = new Fammer();
//老农类中的dispose方法,其中调用tothatLan与tothisLan方法
fammer.dispose(thisLan, thatLan);
}
//实现农夫运送动物的功能
}
class Fammer{
//元素缓存,辅助tothatLan和tothisLan进行元素删除与恢复
private String temp;
//步骤记录
private int time = 1;
//当老农不在时,判断猫狗鱼三者的关系。如果出现狗会咬猫,猫会吃鱼的情况返回false,否则返回true
public boolean safe(ArrayList<String> a){
if((a.contains("狗")&&a.contains("猫")) || (a.contains("猫")&&a.contains("鱼"))){
return false;
}
return true;
}
//从河岸A向河岸B运送动物的方法
public void tothatLan(ArrayList<String> tis,ArrayList<String> tat){
//用于while循环
boolean flag = true;
while(true){
//当河岸A没有动物时说明动物均被带到河岸B
if(tis.size()==0){
//提示结束
System.out.println("结束!");
return;
}
//自动查询符合条件的动物,并带到河岸B
for (int i = 0; i < tis.size(); i++) {
//缓存,用于删除与恢复动物
temp = tis.get(i);
if(tis.remove(temp)){
if(this.safe(tis)){
System.out.println("第"+time+"步,将"+temp+"从河岸A运送到河岸B");
time++;
//动物过河
tat.add(temp);
temp = null;
System.out.println(" "+"河岸A有"+tis);
System.out.println(" "+"河岸B有"+tat);
return;
}else{
//恢复删除
tis.add(temp);
continue;
}
}else{
continue;
}
}
}
}
//从河岸B向河岸A运送动物的方法,与tothatLan相似
public void tothisLan(ArrayList<String> tis,ArrayList<String> tat){
//用于while循环
boolean flag = true;
while(flag){
//当河岸B的动物符合要求或没有动物,便不需要将动物带回河岸A
if(tat.size()<1 || this.safe(tat)){
return;
}
//自动查询符合条件的动物,并带到河岸A
for (int i = 0; i < tat.size(); i++) {
//缓存,用于删除与恢复动物
temp = tat.get(i);
if(tat.remove(temp)){
if(this.safe(tat)){
System.out.println("第"+time+"步,将"+temp+"从河岸B运送到河岸A");
time++;
//动物过河
tis.add(temp);
temp = null;
System.out.println(" "+"河岸A有"+tis);
System.out.println(" "+"河岸B有"+tat);
return;
}else{
//恢复删除
tat.add(temp);
continue;
}
}else{
continue;
}
}
}
}
//自动完成动物过河,调用tothatLan和tothisLan的方法
public void dispose(ArrayList<String> tis,ArrayList<String> tat){
boolean flag = true;
while(flag){
//当河岸A没有动物说明动物全部过河
if(tis.isEmpty()){
return;
}
this.tothatLan(tis, tat);
//当河岸A没有动物说明动物全部过河
if(tis.isEmpty()){
return;
}
this.tothisLan(tis, tat);
}
}
}
|