package com.itheima;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
/*
* 第10题、一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
* 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。
* 编程解决猫狗鱼过河问题。
*/
public class Test10 {
public static void main(String[] args) {
//创建两个集合当做两个河岸
List<String> left=new ArrayList<String>();
List<String> right=new ArrayList<String>();
//老农,狗,猫,鱼在左岸,
Collections.addAll(left, "狗","猫","鱼","老农");
int cishu=1;//渡河次数
while(left.size()!=0){
//次数为单数为老农左岸渡河到右岸,双数老农右岸渡河到左岸
if(cishu%2==1){
//老农随机带一个动物过河;
left.remove("老农");
Random random=new Random();
int x=random.nextInt(left.size());
String animal=left.get(x);
//为了避免老农把刚从右岸带回的动物带回进行判断
//如果cishu大于3,为最后一只动物,且左岸的动物数为2 说明这是刚从右岸带回的动物,重新选择一个
if(cishu>3&&animal.equals(left.get(left.size()-1))&&left.size()==2){
continue;
}else{left.remove(animal);}
//判断是否安全,安全则渡河,不安全则重新选择一只动物
if(isSafe(left)&&isSafe(right)){
right.add(animal);
right.add("老农");
System.out.println("老农第"+cishu+"次渡河把"+animal+"带到右岸");
cishu++;
System.out.println("渡河后右岸的动物:"+right );
System.out.println("渡河后左岸的动物: "+left);
if(right.contains("猫")&&right.contains("狗")&&right.contains("鱼")&&right.contains("老农")){System.out.println("老农、猫、狗、鱼成功渡河!");}
}else{
left.add(animal);
left.add("老农");
}
}else{//老农回左岸
right.remove("老农");
//如果右岸的动物等于2种时才可能会发生危险,所以要带一只动物回左岸
if(right.size()==2){
//如果是鱼和狗则不会发生危险,老农自己返回左岸
if(right.contains("鱼")&&right.contains("狗")){
left.add("老农");
System.out.println("老农第"+cishu+"次渡河自己回到左岸");
cishu++;
System.out.println("渡河后右岸的动物: "+right);
System.out.println("渡河后左岸的动物: "+left);
}else{
//如果不是鱼和狗就会发生危险,老农带一种动物回左岸
Random random=new Random();
int y=random.nextInt(right.size());
String animal2=right.get(y);
//随机选择一种动物带回左岸,判断一下是否为刚从对岸带回来的动物,不是的话就带回左岸,
if(!animal2.equals(right.get(right.size()-1))){
right.remove(animal2);
}else{continue;}
if(isSafe(left)&&isSafe(right)){
left.add(animal2);
left.add("老农");
System.out.println("老农第"+cishu+"次渡河把"+animal2+"带到左岸");
cishu++;
System.out.println("渡河后右岸的动物: "+right);
System.out.println("渡河后左岸的动物:"+left);
}
}
}else{//如果右岸只有一只动物老农自己返回左岸
left.add("老农");
System.out.println("老农第"+cishu+"次渡河自己回到左岸");
cishu++;
System.out.println("渡河后右岸的动物: "+right);
System.out.println("渡河左右岸的动物: "+left);
}
}
}
}
//人猫狗鱼在一起时就不会发危险,所以定义猫狗鱼和谐相处的状态为true,猫狗鱼不和谐的时候为false
public static boolean isSafe(List<String> list){
boolean flag =true;
while(flag){
if((!list.contains("老农"))&&list.contains("鱼")&&list.contains("猫")){
flag=false;
}else if((!list.contains("老农"))&&list.contains("猫")&&list.contains("狗")){
flag=false;
}
break;
}
return flag;
}
}
|
|