package com.itheima;
//一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
//当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。
import java.util.ArrayList;
import java.util.List;
public class Test10{
static List<String> start = new ArrayList<String>();// 定义两边河岸,存放,带过去的动物,和剩下的动物
static List<String> finish = new ArrayList<String>();
static List<String> ship = new ArrayList<String>();
static boolean farmers (List<String> y){
if(y.contains("farmer")){
return false;
}else{
return true;
}
}
public static boolean safe (List<String> x){
if(x.contains("cat")&&x.contains("dog")&&x.contains("farmer")==false
||x.contains("cat")&&x.contains("fish")&&x.contains("farmer")==false){//做一个安全判断
return false;//如果包含猫狗或猫鱼组合返回false;
}else{
return true;
}
}
public static void main(String[] args){
String first=null;
start.add("dog");//起点加入三种动物和农民
start.add("fish");
start.add("cat");
for(int i=0;i<start.size();i++){//循环重置岸边的动物并按脚标顺序假设带走
String temp=start.get(i);//设定假定带走的动物
start.remove(temp);//假如带走的动物
if(safe(start)){//当岸边安全时
System.out.println("我们先带走"+temp);
System.out.println("岸边还剩"+start);
first=temp;//确定满足条件的动物为确定带走的动物
break;//假如不止一种动物满足岸边安全条件,但是实际上真正一次只能带走一只动物
//所以第一个满足条件的动物讲被带走,结束循环
}
start.add(i,temp);//循环结束前再将假定被带走的动物安原位放置回岸边,以便保持岸边动物
//所对应的脚标不变
}
start.remove(first);
ship.add(first);//将这个满足条件的动物带上船
if(safe(finish)){
finish.add(first);//将这个满足条件的动物放下来
System.out.println("岸边安全,农夫不需要下船");
System.out.println("将"+first+"放到对岸后农夫自己又回到起始岸");
}
int x=0;//不满足条件个数
System.out.println("首先假设重复第一次渡河过程,农夫放下动物后独自离开");
for(int i=0;i<start.size();i++){
String temp=start.get(i);//按脚标顺序设定假定带走的动物
start.remove(temp);//将其带离岸边
finish.add(temp);//动物上岸
if(safe(start)&&safe(finish)){
System.out.println("将"+temp+"放到对岸后农夫自己又回到起始岸");
}else {//如果不满足安全条件
x++;//不满足条件个数+1
finish.remove(temp);//复位
start.add(i,temp);
System.out.println("得出结论将"+temp+"带走并放置在对岸农夫独自离开不安全");
}
}
if(x==start.size()){
System.out.println("将动物放置对岸后农夫不能独自离开,需要带动物返程");
System.out.println("复位至从第二次离开起始岸开始");
}
String a=start.get(0);//任意带走一个动物
start.remove(a);//将其带离河对岸
finish.add(0,a);//让动物上岸
System.out.println("当船第二次离开起始岸时岸边时,带走"+a+"目前岸留有"+start);
//System.out.println(finish.size());
for(int i=0;i<finish.size();i++){
String temp=finish.get(i);
finish.remove(temp);
System.out.println("当船第二次离开终点岸时时,带走"+temp+"目前终点岸留有"+finish);
String b=(start.get(0));//将岸边剩下唯一的动物标定
start.add(temp);//动物回起始岸
start.remove(b);//将之前标定的动物带离岸边
System.out.println("当船第三次次离开起始岸边时,带走"+b+"目前起始岸留有"+start);
finish.add(b);
if(safe(finish)){//假如终点安全
System.out.println("一次成功的运送,终点岸目前有"+finish+"起点岸有"+start);
break;
}else{
finish.add(i,temp);//复位
finish.remove(b);
start.remove(temp);
start.add(b);
System.out.println("这次运送不成功,复位,改为从终点带回"+finish.get(i+1));
}
}
String last=start.get(0);
start.remove(last);
if(start.isEmpty()){
System.out.println("最后把"+last+"带走");
}
}
}
|
|