老农解决猫狗鱼的问题(黑马基础习题)

来源:互联网 发布:网络被骗赌博钱能追回 编辑:程序博客网 时间:2024/04/29 20:40
package com.itheima;


import java.util.LinkedList;
import java.util.List;


/**
 * 题目:
 * 10、 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
 * 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
 * @author 杨文冬
 * 思路:
 * 在这道题目中猫比较特殊,当它存在时会与其它动物冲突,所以每次老农携带动物时要考虑是否安全
 * 用左右两个list来存储两岸的动物,当左岸为空时,成功过岸
 */


public class Test10 {

//定义私有成员变量用来存放两岸的动物
private LinkedList<String> left = new LinkedList<String>();
private LinkedList<String> right = new LinkedList<String>();

//构造方法
public Test10() {//初始化左岸
left.add("dog");
left.add("cat");
left.add("fish");
}

public void cross() {//过岸方法

System.out.println("老农解决猫鱼狗问题");

//当左岸不为空时程序要继续运行
while(left.size() > 0) {

//依次考虑左岸右岸
move(left, right);//左岸-->右岸

//右岸-->左岸
if (right.size() == 3) {//所有动物都到达,结束方法
break;
} else if (issafe(right)) {//如果右岸安全,老农返回左岸
System.out.println("老农独自返回");
}else { //右岸为“左岸”考虑
move(right, left);
}

}
}
//老农携带动物从“左岸”到“右岸”
private void move(LinkedList<String> leftside, LinkedList<String> rightside) {
//左岸,每次从“左岸”第一个动物开始判断是否可以安全带走,
String lr = leftside.equals(left)?"右":"左";//用于记录老农移动方向
while (true) {//依次判断老农可以安全带走的动物
rightside.add(leftside.pollFirst()); //将左岸第一只动物移到右岸放到最后
if (issafe(leftside)) {//如果左岸安全
System.out.println("老农带着" + rightside.getLast() + "到" + lr + "岸");
break; //如果可以带到右岸则左岸结束考虑右岸
}else {
leftside.add(rightside.pollLast());//左岸不安全,撤销原操作,将不能带走的动物放到最后
}
}
}

//判断某岸是否安全
private boolean issafe(List<String> l) {
if(l.contains("cat") && l.size() > 1) {
return false;
}
return true;

}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Test10 test = new Test10();
test.cross();
}


}
0 0
原创粉丝点击