`
MouseLearnJava
  • 浏览: 460661 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

限定时间内过桥,JAVA程序实现

阅读更多
题目:小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭。那么,请问小明一家,如何在三十秒内过桥?

下面是个简单的实现,还没有进行代码优化,将一定时间范围内的过桥组合都打印出来

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。
 * 每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭。
 * 那么,请问小明一家,如何在三十秒内过桥?
 * @version 1.0
 */

public class CrossBridge {

 private static final String SPEND_TIME = "花费时间: ";

 private static final String STEPS_ARROW = "步骤-->";

 private static final String BACK_ARROW = "<----Back ";

 private static final String GO_ARROW = "--- >GO";

 private static final String RIGHT_BRACKET = "}";

 private static final String LEFT_BRACKET = "{";

 private static final String LINE_BREAK = "\n";

 // 逗号分割符
 private static final String COMMA_DELIMITED = ",";

 // 设置有限的秒数
 private static final int LIMITED_SECONDS = 30;

 // 用于存储人物和过桥时间
 private static Map<String, Integer> map = new HashMap<String, Integer>();
 static {
  map.put("A", 1);// 小明过桥要一秒
  map.put("B", 3);// 小明的弟弟要三秒
  map.put("C", 6);// 小明的爸爸要六秒
  map.put("D", 8);// 小明的妈妈要八秒
  map.put("E", 12);// 小明的爷爷要十二秒

 }

 /**
  * 
  * @param source
  *            需要过桥的人员
  * @param target
  *            已经过桥的人员
  * @param elapsedSeconds
  *            已经花费的时间
  * @param steps
  *            用于记录过桥的经过
  */
 public void doCrossBridge(List<String> source, List<String> target,
   int elapsedSeconds, StringBuilder steps) {

  for (String twoPersonToCross : getAllResultSet(source)) {
   String[] seperatedPersons = twoPersonToCross.split(COMMA_DELIMITED);
   List<String> currentSourceToGo = new ArrayList<String>(source);
   List<String> currentTargetInWaiting = new ArrayList<String>(target);
   StringBuilder currentStepsToGo = new StringBuilder(steps);
   int currentTimeFromSource = elapsedSeconds;

   for (String person : seperatedPersons) {
    currentSourceToGo.remove(person);
    currentTargetInWaiting.add(person);
   }
   currentTimeFromSource += getLargeSeconds(seperatedPersons[0],
     seperatedPersons[1]);

   currentStepsToGo.append(LEFT_BRACKET).append(twoPersonToCross)
     .append(RIGHT_BRACKET).append(GO_ARROW).append(LINE_BREAK);
   if (currentSourceToGo.isEmpty()) {
    if (currentTimeFromSource < LIMITED_SECONDS) {
     System.out.print(SPEND_TIME);
     System.out.println(currentTimeFromSource);
     System.out.println(STEPS_ARROW);
     System.out.println(currentStepsToGo.toString());
    }
   } else {
    for (String personToBack : currentTargetInWaiting) {
     StringBuilder currentStepsToBack = new StringBuilder(
       currentStepsToGo.toString());
     int currentTimeFromTarget = currentTimeFromSource;
     List<String> currentTargetToBack = new ArrayList<String>(
       currentTargetInWaiting);
     currentTargetToBack.remove(personToBack);
     List<String> currentSourceInWaiting = new ArrayList<String>(
       currentSourceToGo);
     currentSourceInWaiting.add(personToBack);
     currentStepsToBack.append(LEFT_BRACKET)
       .append(personToBack).append(RIGHT_BRACKET).append(
         BACK_ARROW).append(LINE_BREAK);
     currentTimeFromTarget += map.get(personToBack);
     // 重新调用
     doCrossBridge(currentSourceInWaiting, currentTargetToBack,
       currentTimeFromTarget, currentStepsToBack);
    }
   }
  }
 }

 /**
  * 
  * @param s1
  * @param s2
  * @return 获取花费过桥时间多的人员的秒数
  */
 private int getLargeSeconds(String s1, String s2) {
  return (map.get(s1) >= map.get(s2)) ? map.get(s1) : map.get(s2);
 }

 /**
  * 给定几个人,获取所有的两个人一起过桥的所有的组合 A,B与B,A过桥是一样的,A,A过桥是不可能的,这些情况都要去除
  * 
  * @param list
  *            需要过桥的人员
  * @return 获取所有的两个人一起过桥的所有的组合
  */
 private List<String> getAllResultSet(List<String> list) {
  List<String> result = new ArrayList<String>();
  String[] s = new String[list.size()];
  list.toArray(s);
  for (int i = 0; i < s.length - 1; i++) {
   for (int j = 0; j < s.length; j++) {
    if (!s[i].equals(s[j])
      && !result.contains(s[i] + COMMA_DELIMITED + s[j])
      && !result.contains(s[j] + COMMA_DELIMITED + s[i])) {
     result.add(s[i] + COMMA_DELIMITED + s[j]);
    }
   }
  }
  return result;
 }

 public static void main(String[] args) {
  List<String> list = new ArrayList<String>();
  list.add("A");
  list.add("B");
  list.add("C");
  list.add("D");
  list.add("E");
  new CrossBridge().doCrossBridge(list, new ArrayList<String>(), 0,
    new StringBuilder());
 }

}

输出结果如下:

花费时间: 29
步骤-->
{A,B}--- >GO
{A}<----Back
{C,A}--- >GO
{B}<----Back
{D,E}--- >GO
{A}<----Back
{B,A}--- >GO

花费时间: 29
步骤-->
{A,B}--- >GO
{A}<----Back
{C,A}--- >GO
{A}<----Back
{D,E}--- >GO
{B}<----Back
{A,B}--- >GO

花费时间: 29
步骤-->
{A,B}--- >GO
{A}<----Back
{D,E}--- >GO
{B}<----Back
{C,A}--- >GO
{A}<----Back
{B,A}--- >GO

花费时间: 29
步骤-->
{A,B}--- >GO
{A}<----Back
{D,E}--- >GO
{B}<----Back
{A,B}--- >GO
{A}<----Back
{C,A}--- >GO

花费时间: 29
步骤-->
{A,B}--- >GO
{B}<----Back
{D,E}--- >GO
{A}<----Back
{C,A}--- >GO
{A}<----Back
{B,A}--- >GO

花费时间: 29
步骤-->
{A,B}--- >GO
{B}<----Back
{D,E}--- >GO
{A}<----Back
{B,A}--- >GO
{A}<----Back
{C,A}--- >GO

花费时间: 29
步骤-->
{A,C}--- >GO
{A}<----Back
{B,A}--- >GO
{B}<----Back
{D,E}--- >GO
{A}<----Back
{B,A}--- >GO

花费时间: 29
步骤-->
{A,C}--- >GO
{A}<----Back
{B,A}--- >GO
{A}<----Back
{D,E}--- >GO
{B}<----Back
{A,B}--- >GO


0
5
分享到:
评论
1 楼 oham_一1一 2014-12-12  
题目描述不具体呀,关键是那盏灯怎么处理题目没有说。两人过桥时必须有一人提灯吗?两人相对行走而一人提灯这种情况时是否准许?

相关推荐

    基于Java SSM的Java程序设计在线考试系统的设计与实现

    Java程序设计在线考试系统是通过网络的形式来完成Java程序设计这门课的考试,通过信息化管理的方式实现试题、试卷、考试、批改以及成绩查询为一体的管理系统,提高了Java程序设计的考试效率,为试卷的批改和成绩的...

    分支限定算法JAVA

    分支限定算法JAVA,此文件是是pdf格式,讲述了怎么建立class.和function

    Java语言程序设计 基础篇 第10版,程序清单12_1~6

    Java语言程序设计 基础篇 第10版,程序清单12_1~6,懒癌晚期限定

    java实现的电梯仿真程序

    用面向对象方法和面向对象程序设计语言,实现满足下述要求的一个高层建筑电梯活动 仿真程序。 问题域概述 某国际展览中心共 40 层,设有载客电梯10 部(用E0~E9 标识)。 限定条件 (1) 电梯的运行规则是: E0、E1...

    java源码包---java 源码 大量 实例

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java通过线程控制程序执行超时(新)

    java通过线程控制程序执行超时(新) 基本数据类型 反射 线程 超时

    Java实现 电梯模拟系统(附有开发文档和程序代码 )

    java swing 实现的电梯模拟系统,能够通过界面方式简易模拟电梯的运行,管理员登录,设置等基本功能!附有开发文档,程序代码和界面的一些图片,开发环境为:JCreator,一些功能还未实现,希望给你一点借鉴,并希望你...

    java源码包4

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java源码包3

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    JAVA上百实例源码以及开源项目源代码

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    JAVA上百实例源码以及开源项目

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...

    java源码包2

     Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...

    java期末考试试题

    5 开发与运行JAVA程序需要经过的三个主要步骤为 编写源程序 , _____________和 ______________。 6 JAVA中类成员的限定词有以下几种:public , __________ ,默认和private。其中, __________ 的开放范围最小。

    VisualC 实效编程 120 限定程序的使用时限

    VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限...

    JAVA复习资料

    9、Java中类成员的限定词有以下几种:private, _protected__, public__, 默认友好。 10、基类的公有成员在派生类中的访问权限由_基类___决定。 11、用static修饰的方法,称为静态方法。它们不是对象的方法,...

    Strassen矩阵连乘问题,Java实现

    设计一个矩阵相乘的Strassen算法编程实现并做算法的时间复杂性分析。 其中:乘积矩阵C = A*B, A=(aij)n*n,B=(bij)n*n (1)考虑n为2的幂次方的情形,取n=8实现分治递归; (2)考虑n不是2的幂次方,n为偶数的...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    Java ATM可视化存取款程序设计

    学校Java专题训练的题目,实现了存取款、查询余额、密码修改及转账功能。在设计时,限定了其只能对100元的人民币进行操作。

    使用Java实现的拼图游戏

    备注: 可直接下载文件夹“代码”,然后执行“pintu.java”程序 说明文档在README.md中 安装与初始化 解压pintu.zip压缩包; ...使用Sublime text运行pintu.java文件;...图片在限定区域内的移动。

    java聊天器程序限于局域网通信

    用java写的聊天器,限定在局域网中实现

Global site tag (gtag.js) - Google Analytics