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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 你媚你魅你 初级黑马   /  2014-7-28 16:42  /  1422 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。

1 个回复

倒序浏览
昨天刚刚搞定这题目,只要认真分析,将题目中涉及到的事物和行为进行抽象,利用编程语言表达出来,解题思路就清晰了。以下是我参考自刘望望同学回帖自己整理的代码分析:
  1. package com.itheima;

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

  5. public class Test10 {

  6.         /**
  7.          * 10、一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  8.          * 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。 编程解决猫狗鱼过河问题。
  9.          *
  10.          * @author Cavenzep
  11.          */
  12.         // 将河的两岸分别抽象成左右两个装有String的集合左岸(left)和右岸(right)
  13.         List<String> left = new ArrayList<String>();
  14.         List<String> right = new ArrayList<String>();

  15.         // 初始化,老农、猫、狗、鱼都在河左岸准备渡河
  16.         public Test10() {
  17.                 left.add("老农");
  18.                 left.add("猫");
  19.                 left.add("狗");
  20.                 left.add("鱼");

  21.         }

  22.         // 渡河
  23.         public void crossRiver() {
  24.                 while (left.size() > 1) {
  25.                         left.remove("老农");
  26.                         Random random = new Random();
  27.                         // 老农在左岸随机带走一个动物
  28.                         int index = random.nextInt(left.size());
  29.                         // 防止老农带走上次带过来的动物,加快效率
  30.                         if (left.size() > 1 && index == left.size() - 1) {
  31.                                 left.add("老农");
  32.                                 continue;
  33.                         }
  34.                         String L2R = left.get(index);
  35.                         left.remove(L2R);
  36.                         // 如果老农带走L2R后左岸和谐,则老农和L2R到达右岸
  37.                         if (isSafe(left)) {
  38.                                 right.add("老农");
  39.                                 right.add(L2R);
  40.                                 System.out.println("老农带着" + L2R + "到达右岸"
  41.                                                 + currentStatus(left, right));
  42.                                 // 老农到达右岸后判断是否完成渡河
  43.                                 if (4 == right.size()) {
  44.                                         break;
  45.                                 }
  46.                                 // 老农在右岸放下动物L2R准备返回
  47.                                 right.remove("老农");
  48.                                 // 如果老农返回后右岸和谐,则独自返回
  49.                                 if (isSafe(right)) {
  50.                                         left.add("老农");
  51.                                         System.out.println("老农独自返回左岸" + currentStatus(left, right));
  52.                                 } else { // 否则要在右岸随机带一个动物R2L返回
  53.                                         String R2L = right.get(random.nextInt(right.size()));
  54.                                         // 如果第一次随机到的动物R2L和L2R一样,则重新随机
  55.                                         while (R2L.equals(L2R)) {
  56.                                                 R2L = right.get(random.nextInt(right.size()));
  57.                                         }
  58.                                         right.remove(R2L);
  59.                                         // 老农带着动物R2L返回
  60.                                         left.add("老农");
  61.                                         left.add(R2L);
  62.                                         System.out.println("老农带着" + R2L + "返回左岸"
  63.                                                         + currentStatus(left, right));
  64.                                 }
  65.                         } else { // 老农带走L2R后左岸不和谐,则放下该动物
  66.                                 left.add(L2R);
  67.                                 left.add("老农");
  68.                         }

  69.                 }
  70.                 System.out.println("老农带着猫、狗、鱼成功渡河");
  71.         }

  72.         // 根据规则判断当前河岸是否和谐
  73.         private boolean isSafe(List<String> arrayList) {
  74.                 boolean flag = true;
  75.                 // 如果某一岸边没有老农在,并且猫和其他动物在一起,就不和谐
  76.                 if (arrayList.size() > 1 && arrayList.contains("猫")
  77.                                 && !arrayList.contains("老农")) {
  78.                         flag = false;
  79.                 }
  80.                 return flag;
  81.         }

  82.         // 显示河两岸当前的成员情况
  83.         public String currentStatus(List<String> left, List<String> right) {
  84.                 return "\t\t\tL:" + left.toString() + "------R:" + right.toString();
  85.         }

  86.         // 主函数
  87.         public static void main(String[] args) {

  88.                 Test10 test11 = new Test10();
  89.                 test11.crossRiver();
  90.         }

  91. }
复制代码


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马