黑马程序员技术交流社区
标题:
关于老农带着三个小动物过河的问题
[打印本页]
作者:
女神从来不加班
时间:
2015-3-8 14:44
标题:
关于老农带着三个小动物过河的问题
package com.itheima;
import java.util.ArrayList;
import java.util.List;
/**
* 10、 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,
* 则不会发生这种问题。编程解决猫狗鱼过河问题。
*
* @author GP
*
*/
public class Test10 {
static int count = 0;// 用于标记运送的次数
static String last = null;// 用于记录上次运送的是什么动物
static List<String> listFrom = new ArrayList<String>();// 表示原地的动物集合
static List<String> listTo = new ArrayList<String>();// 表示对岸的动物集合
static String[] dic = new String[] { "鱼", "猫", "狗" };// 包括了所有动物的字典
public static void main(String[] args) {
listFrom.add("鱼");
listFrom.add("猫");
listFrom.add("狗");// 开始时候动物都在原地
convey();
}
private static void convey() {
while (true) {// 循环执行
toAnother();// 每次先执行送往对岸的动作
if (listFrom.size() == 0) {// 原地的动物集合中没有元素时,表示运送完毕
System.out.println("运送完毕!");
return;
}
goBack();// 然后在执行回到原地的动作
}
}
/*
* 送往对岸
*/
private static void toAnother() {
if ((listFrom.size() == 1) && (listFrom.get(0).equals("猫"))) {// 判断
// 如果原地只剩下一只动物,并且是猫,那么这就将是最后一次运送
listFrom.remove("猫");
count++;
System.out.println("第" + count + "次把猫送到对岸。");
return;
}
String s = null;// 用于记录模拟运送的动物
for (String ani : dic) {
s = ani;
if (listFrom.contains(ani) && (!ani.equals(last))) {// 需要判断本次运送的动物和上次是否相同
// 排除同一只动物无限循环的被送来送去
listFrom.remove(ani);
listTo.add(ani);
if (isSafe(listFrom)) {// 如果原地情况安全
count++;
System.out.println("第" + count + "次把" + ani + "送到对岸。");
last = ani;
break;
} else {// 如果原地情况不安全
listFrom.add(s);// 如果不安全就把刚才模拟删掉的元素加回来
listTo.remove(s);
}
}
}
}
/*
* 返回原地
*/
private static void goBack() {
if (isSafe(listTo)) {// 如果老农空船回到原地,对岸安全的情况
count++;
System.out.println("第" + count + "次老农空船回原地。");
last = "";
return;
}
String s = null;
for (String ani : dic) {
s = ani;
if (listTo.contains(ani) && (!ani.equals(last))) {
listTo.remove(ani);
listFrom.add(ani);
if ((isSafe(listTo)) && (!isSafe(listFrom))) {
count++;
System.out.println("第" + count + "次把" + ani + "送回原地。");
last = ani;
break;
} else {
listTo.add(s);
listFrom.remove(s);
}
}
}
}
/*
* 判断运送过程是否可行
*/
private static boolean isSafe(List<String> list) {
if (list.contains("鱼") && list.contains("猫")) {
return false;
}
if (list.contains("狗") && list.contains("猫")) {
return false;
}
return true;
}
}
复制代码
作者:
女神从来不加班
时间:
2015-3-8 14:45
代码写的很嫩 希望大神们帮着改改
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2