package com.itheima;
import java.util.ArrayList;
/**
* 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
* 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,
* 则不会发生这种问题。编程解决猫狗鱼过河问题。
* @author xiaocheng
*
*/
/**
* 题目分析:
* 假设开始时农夫带着猫,狗和鱼都在河岸左边,农夫要带这些动物去河岸右边。
* 因为狗会咬猫,猫会吃鱼,所以当农夫不在时,不能让猫和狗或者是猫和鱼
* 同时待在一个地方,只能让狗和鱼待在同一个地方,而农夫在时三者可以共存
* 方法一:
* 第一次:农夫把猫从河岸左边带到河岸右边,左边:狗和鱼,右边:猫和农夫。
* 第二次: 农夫单独返回到河岸左边,左边:农夫,狗和鱼,右边:猫。
* 第三次: 农夫把狗从河岸左边带到河岸右边,左边:鱼,右边:农夫,猫和狗。
* 第四次:农夫把猫从河岸右边带回河岸左边,左边:农夫,猫和鱼,右边:狗。
* 第五次: 农夫把鱼从河岸左边带到河岸右边,左边:猫,右边:农夫,狗和鱼
* 第六次: 农夫单独返回到河岸左边,左边:农夫和猫,右边:狗和鱼
* 第七次:农夫把猫从河岸左边带到河岸右边,左边:无,右边:农夫,猫,狗和鱼。
*
*/
public class Test10 {
//定义两个list集合,一个用来存放河岸左边的动物,一个用来存放河岸右边的动物
private static ArrayList<String> left = new ArrayList<String>();
private static ArrayList<String> right = new ArrayList<String>();
//定义三个动物的字符串变量
private static String cat = "猫";
private static String dog = "狗";
private static String fish = "鱼";
private static String farmer = "农夫";
/**
* 主函数
* @param args
*/
public static void main(String[] args) {
new Test10(); //对自定义构造函数进行初始化
move(); //调用农夫运动物过河的函数
}
//构造函数初始化,一初始化就往河岸左边的集合中添加农夫,猫,狗和鱼(farmer,cat,dog,fish)
public Test10()
{
left.add(farmer);
left.add(cat);
left.add(dog);
left.add(fish);
}
/**
* 定义农夫运动物过河的函数
*/
public static void move()
{
int time = 0; //定义一个整形变量,用来记录农过河的次数
String animal = null; //定义一个字符串变量,用来记录要运过河的动物
while(!left.isEmpty())
{
time++; //计算次数
animal = null; //初始化为空
if(time%2==1) //次数为奇数时,表示农夫把动物从河岸左边往河岸右边运
{
for(int x=0;x<left.size();x++)
{
left.remove(farmer);
animal = left.remove(x); //农夫把河岸左边一个动物运到河岸右边去
//如果河岸左边,安全,则往河岸右边添加该动物,同时往河岸右边添加农夫
if(isSafe(left))
{
right.add(animal);
right.add(farmer);
break;
}else{ //如果不安全,则结束本次循环,继续下一次循环
left.add(animal); //左边动物不安全,恢复删除
//left.add(farmer);
continue;
}
}
System.out.println("第"+time+"次:农夫把"+animal+"从河岸左边->河岸右边\t"+"河岸左边:"+left+", 河岸右边:"+right);
}else{ //次数为偶数时,表示农夫从河岸左边回河岸右边,有可能是单独回,也有可能是带走一个动物回
//当河岸右边动物之间不安全时,则进行循环,否则结束循环
while(!isSafe(right))
{
for(int x=0;x<right.size();x++)
{
//因为河岸右边是不安全的,所以农夫在返回河岸左边的时候,要带回一个动物
right.remove(farmer);
animal = right.remove(x);
//如果该动物被带回后河岸右边是安全的,则往河岸左边添加该动物,同时农夫也回到河岸左边
if(isSafe(right))
{
left.add(animal);
left.add(farmer);
break;
}else{ //如果不安全,则结束本次循环,继续下一次循环
right.add(animal); //右边动物不安全,恢复删除
//right.add(farmer);
continue;
}
}
}
if(animal==null)
{
right.remove(farmer);
left.add(farmer);
System.out.println("第"+time+"次:农夫划船独自回河岸左边 \t"+"河岸左边:"+left+", 河岸右边:"+right);
}
else
System.out.println("第"+time+"次:农夫把"+animal+"从河岸右边->河岸左边\t"+"河岸左边:"+left+", 河岸右边:"+right);
}
}
System.out.println("猫狗鱼成功过河,问题解决了!");
}
//当农夫不在时,猫和狗或者猫和鱼在同一河岸时,是不安全的,返回false,否则是安全的,返回true
public static boolean isSafe(ArrayList<String> list)
{
if(list.contains(dog)&&list.contains(cat))
return false;
else if(list.contains(cat)&&list.contains(fish))
return false;
else
return true;
}
}
|
|