- public class Test10 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // 首先创建3个集合分别代表河岸左边和河岸右边还有船
- ArrayList<String> left = new ArrayList<String>();
- ArrayList<String> right = new ArrayList<String>();
- ArrayList<String> boat = new ArrayList<String>();
- // 开始所有动物和人都在左岸
- left.add("person");
- left.add("cat");
- left.add("dog");
- left.add("fish");
- while (left.size() > 0) {
- // 判断左岸是否有老农,有的话老农上船
- if (left.contains("person")) {
- left.remove("person");
- boat.add("person");
- System.out.println("老农上船");
- }
- Random r = new Random();
- // 随机带一只动物上船
- int num = r.nextInt(left.size());
- boat.add(left.get(num));
- String animal = left.remove(num);
- System.out.println(animal + "上船了");
- boat.remove(animal);
- right.add(animal);
- System.out.println(animal + "到达右岸");
- if (right.size() >= 2) {// 如果右岸有两只或者两只以上的动物进入该if语句
- if (left.size() != 0) {// 如果此时左岸已经没有动物了,则不需要判断是否安全了,因为老农会和最后一只动物一起上岸
- if (!isSafe(right)) {// 判断是否安全,如果不安全,进入该if代码块
- num = r.nextInt(right.size());// 随机从右岸带走一只动物
- System.out.println("将" + right.get(num) + "带回左岸");
- String backAnimal = right.remove(num);
- boat.add(backAnimal);
- System.out.println(backAnimal + "上船了");
- boat.remove(backAnimal);
- left.add(backAnimal);
- System.out.println(backAnimal + "回到左岸");
- }
- } else {// 左岸已经没有动物,还有一只动物和一个人在船上
- for (int i = 0; i < boat.size(); i++) {
- right.add(boat.get(i));
- // String rightAnimal=boat.remove(i);
- System.out.println(boat.get(i) + "到达右岸");
- }
- }
- }
- }
-
- System.out.println("此时右岸有");
- for (int i = 0; i < right.size(); i++) {
- System.out.print( right.get(i)+"\t");
- }
- System.out.println("过河成功!");
- }
- /**
- * 判断是否和谐的方法
- */
- public static boolean isSafe(ArrayList<String> list) {
- boolean isSafe = true;
- // 分析知道几个动物之间只要有猫存在就不和谐
- if (list.contains("cat") && list.size() >= 2) {
- if (!list.contains("person")) {
- isSafe = false;
- }
- }
- return isSafe;
- }
- }
复制代码 |