黑马程序员技术交流社区
标题:
java基础猫狗鱼问题怎么做??????
[打印本页]
作者:
你媚你魅你
时间:
2014-7-28 16:42
标题:
java基础猫狗鱼问题怎么做??????
一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
作者:
八零、玖羚
时间:
2014-7-28 17:04
昨天刚刚搞定这题目,只要认真分析,将题目中涉及到的事物和行为进行抽象,利用编程语言表达出来,解题思路就清晰了。以下是我
参考自刘望望同学回帖
自己整理的代码分析:
package com.itheima;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test10 {
/**
* 10、一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
* 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。 编程解决猫狗鱼过河问题。
*
* @author Cavenzep
*/
// 将河的两岸分别抽象成左右两个装有String的集合左岸(left)和右岸(right)
List<String> left = new ArrayList<String>();
List<String> right = new ArrayList<String>();
// 初始化,老农、猫、狗、鱼都在河左岸准备渡河
public Test10() {
left.add("老农");
left.add("猫");
left.add("狗");
left.add("鱼");
}
// 渡河
public void crossRiver() {
while (left.size() > 1) {
left.remove("老农");
Random random = new Random();
// 老农在左岸随机带走一个动物
int index = random.nextInt(left.size());
// 防止老农带走上次带过来的动物,加快效率
if (left.size() > 1 && index == left.size() - 1) {
left.add("老农");
continue;
}
String L2R = left.get(index);
left.remove(L2R);
// 如果老农带走L2R后左岸和谐,则老农和L2R到达右岸
if (isSafe(left)) {
right.add("老农");
right.add(L2R);
System.out.println("老农带着" + L2R + "到达右岸"
+ currentStatus(left, right));
// 老农到达右岸后判断是否完成渡河
if (4 == right.size()) {
break;
}
// 老农在右岸放下动物L2R准备返回
right.remove("老农");
// 如果老农返回后右岸和谐,则独自返回
if (isSafe(right)) {
left.add("老农");
System.out.println("老农独自返回左岸" + currentStatus(left, right));
} else { // 否则要在右岸随机带一个动物R2L返回
String R2L = right.get(random.nextInt(right.size()));
// 如果第一次随机到的动物R2L和L2R一样,则重新随机
while (R2L.equals(L2R)) {
R2L = right.get(random.nextInt(right.size()));
}
right.remove(R2L);
// 老农带着动物R2L返回
left.add("老农");
left.add(R2L);
System.out.println("老农带着" + R2L + "返回左岸"
+ currentStatus(left, right));
}
} else { // 老农带走L2R后左岸不和谐,则放下该动物
left.add(L2R);
left.add("老农");
}
}
System.out.println("老农带着猫、狗、鱼成功渡河");
}
// 根据规则判断当前河岸是否和谐
private boolean isSafe(List<String> arrayList) {
boolean flag = true;
// 如果某一岸边没有老农在,并且猫和其他动物在一起,就不和谐
if (arrayList.size() > 1 && arrayList.contains("猫")
&& !arrayList.contains("老农")) {
flag = false;
}
return flag;
}
// 显示河两岸当前的成员情况
public String currentStatus(List<String> left, List<String> right) {
return "\t\t\tL:" + left.toString() + "------R:" + right.toString();
}
// 主函数
public static void main(String[] args) {
Test10 test11 = new Test10();
test11.crossRiver();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2