A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package com.itheima;

  2. import java.util.ArrayList;
  3. import java.util.List;

  4. /**
  5. * 10、 一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,
  6. * 则不会发生这种问题。编程解决猫狗鱼过河问题。
  7. *
  8. * @author GP
  9. *
  10. */
  11. public class Test10 {

  12.         static int count = 0;// 用于标记运送的次数
  13.         static String last = null;// 用于记录上次运送的是什么动物
  14.         static List<String> listFrom = new ArrayList<String>();// 表示原地的动物集合
  15.         static List<String> listTo = new ArrayList<String>();// 表示对岸的动物集合
  16.         static String[] dic = new String[] { "鱼", "猫", "狗" };// 包括了所有动物的字典

  17.         public static void main(String[] args) {

  18.                 listFrom.add("鱼");
  19.                 listFrom.add("猫");
  20.                 listFrom.add("狗");// 开始时候动物都在原地

  21.                 convey();
  22.         }

  23.         private static void convey() {

  24.                 while (true) {// 循环执行

  25.                         toAnother();// 每次先执行送往对岸的动作

  26.                         if (listFrom.size() == 0) {// 原地的动物集合中没有元素时,表示运送完毕
  27.                                 System.out.println("运送完毕!");
  28.                                 return;
  29.                         }

  30.                         goBack();// 然后在执行回到原地的动作

  31.                 }
  32.         }

  33.         /*
  34.          * 送往对岸
  35.          */
  36.         private static void toAnother() {

  37.                 if ((listFrom.size() == 1) && (listFrom.get(0).equals("猫"))) {// 判断
  38.                                                                                                                                                 // 如果原地只剩下一只动物,并且是猫,那么这就将是最后一次运送
  39.                         listFrom.remove("猫");
  40.                         count++;
  41.                         System.out.println("第" + count + "次把猫送到对岸。");
  42.                         return;
  43.                 }

  44.                 String s = null;// 用于记录模拟运送的动物
  45.                 for (String ani : dic) {
  46.                         s = ani;
  47.                         if (listFrom.contains(ani) && (!ani.equals(last))) {// 需要判断本次运送的动物和上次是否相同
  48.                                                                                                                                 // 排除同一只动物无限循环的被送来送去

  49.                                 listFrom.remove(ani);
  50.                                 listTo.add(ani);

  51.                                 if (isSafe(listFrom)) {// 如果原地情况安全

  52.                                         count++;
  53.                                         System.out.println("第" + count + "次把" + ani + "送到对岸。");
  54.                                         last = ani;
  55.                                         break;
  56.                                 } else {// 如果原地情况不安全
  57.                                         listFrom.add(s);// 如果不安全就把刚才模拟删掉的元素加回来
  58.                                         listTo.remove(s);
  59.                                 }

  60.                         }
  61.                 }

  62.         }

  63.         /*
  64.          * 返回原地
  65.          */
  66.         private static void goBack() {

  67.                 if (isSafe(listTo)) {// 如果老农空船回到原地,对岸安全的情况
  68.                         count++;
  69.                         System.out.println("第" + count + "次老农空船回原地。");
  70.                         last = "";
  71.                         return;
  72.                 }

  73.                 String s = null;
  74.                 for (String ani : dic) {
  75.                         s = ani;
  76.                         if (listTo.contains(ani) && (!ani.equals(last))) {
  77.                                 listTo.remove(ani);
  78.                                 listFrom.add(ani);
  79.                                 if ((isSafe(listTo)) && (!isSafe(listFrom))) {
  80.                                         count++;
  81.                                         System.out.println("第" + count + "次把" + ani + "送回原地。");
  82.                                         last = ani;
  83.                                         break;
  84.                                 } else {
  85.                                         listTo.add(s);
  86.                                         listFrom.remove(s);
  87.                                 }
  88.                         }
  89.                 }

  90.         }

  91.         /*
  92.          * 判断运送过程是否可行
  93.          */
  94.         private static boolean isSafe(List<String> list) {

  95.                 if (list.contains("鱼") && list.contains("猫")) {
  96.                         return false;
  97.                 }
  98.                 if (list.contains("狗") && list.contains("猫")) {
  99.                         return false;
  100.                 }
  101.                 return true;

  102.         }
  103. }
复制代码

1 个回复

倒序浏览
代码写的很嫩 希望大神们帮着改改
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马