`
MouseLearnJava
  • 浏览: 463862 次
  • 性别: 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

    ### 分支限定算法在Java中的应用与实现 #### 一、分支限定算法(Branch & Bound)简介 **分支限定算法**是一种解决组合优化问题的有效方法,尤其适用于解决那些解空间非常大的问题。它通过逐步缩小搜索范围来寻找...

    使用JavaService把Java程序转换成windows服务

    将Java程序转换为Windows服务是通过JavaService工具实现的,这个工具允许Java应用程序在Windows操作系统中作为服务运行,从而在系统启动时自动启动程序,并且可以在服务管理器中进行管理。下面将详细讲解如何操作和...

    java程序打包方案

    ### Java程序打包方案详解 #### 一、引言 在Java开发过程中,为了方便地部署和执行Java应用程序,经常需要将编写的Java源代码或类文件打包成可执行的格式。尤其是在Windows环境下,为了让非技术人员也能轻松运行...

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

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

    高等教育自学考试_课程代码04747_Java语言程序设计(一).pdf

    "高等教育自学考试_Java语言程序设计" Java语言程序设计是一门基础课程,旨在培养学生掌握Java语言的基本知识和技能。本节课程主要介绍Java语言的基础知识,包括Java语言的特点、执行过程、开发和运行Java程序的...

    打包java程序为exe文件

    Java程序通常运行在Java虚拟机(JVM)上,但为了方便非Java开发人员或用户使用,有时我们需要将Java程序转换为可执行的Windows程序(.exe)。这可以通过一些第三方工具实现,例如`exe4j`和`Inno Setup`。这两个工具...

    java用bat运行程序

    在IT行业中,尤其是在Windows操作系统环境下,我们经常需要执行一些Java程序。为了方便快捷地运行这些程序,我们可以将它们封装到批处理(.bat)文件中。这样,只需双击.bat文件,就可以自动调用Java虚拟机(JVM)...

    Java Service Provider实现

    在Java平台上,Service Provider Interface (SPI) 是一种允许第三方开发者扩展Java应用程序的机制。它使得开发者可以为已存在的服务提供自定义实现,而无需修改原始的代码。在Java的类库中,许多接口都利用了SPI,...

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

    本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会涉及基本数据类型、反射以及它们在超时控制中的应用。 首先,我们要理解Java中的线程。线程是程序的执行单元,每个线程都有自己的执行路径...

    Java程序设计试卷

    Java程序设计试卷主要涵盖Java语言的基础知识,包括类文件、编译、程序设计步骤、数据类型、流程控制结构、变量赋值、运算符优先级、类的构造与访问修饰符、对象创建、包的导入、构造方法命名规则、类成员限定词、...

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

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

    Java语言程序设计(郑莉)课后习题答案

    Java语言程序设计(郑莉)课后习题答案 Java语言程序设计是计算机科学领域中的一门重要学科,以下是对Java语言程序设计(郑莉)课后习题答案的知识点总结: 对象和类 * 对象是包含现实世界物体特征的抽象实体,它...

    java编程实现求平均分

    根据给定的文件信息,本篇文章将详细解析如何利用Java编程语言实现三门课程的平均分计算,并且通过三种不同的循环结构(for、while、do-while)来完成这一任务。此外,还将介绍如何利用Java中的`Math.random()`函数...

    概观C++与java程序设计语言的特征

    ### 概观C++与Java程序设计语言的特征 随着计算机技术的发展,程序设计语言越来越多,其中C++和Java可以说是目前应用最为广泛的语言之一,这与其优良的特性密不可分。本文将着重探讨这两种程序语言的特征,分别总结...

    java spi实现工程

    在Java的`java.util.ServiceLoader`类中,SPI的实现方式得以体现。 在这个“java spi实现工程”中,我们可以看到一个简单的Java SPI应用实例。下面将详细讲解Java SPI的基本原理、使用步骤以及相关的关键组件。 1....

    linux 通过脚本执行java程序

    在上述脚本中,`MAIN_CLASS`是你的Java程序的主类名,需要替换为实际的全限定类名。`CLASSPATH`定义了Java程序的类路径,可以包含当前目录(".")和其他需要的JAR文件。`JAVA_OPTS`用于设置Java虚拟机(JVM)的参数...

    java程序的编码通过样例test。java(附执行程序)

    在命令行中输入`java Test`,这里的`Test`是主类的全限定名(包括包名,如果没有指定包名,则默认为无名包),JVM会加载并执行`Test.class`中的`main`方法,这是Java程序的入口点。 `main`方法的定义如下: ```java...

    利用脚本启动java程序

    2. **指定主类和JAR文件** - 明确指出Java程序的主类名(包含package的全限定类名)和JAR文件的位置。例如,使用`java -cp 或 -jar`选项来指定类路径或直接运行JAR文件。 3. **传递参数** - 如果Java程序需要接收...

    java轻松实现—定时任务

    Java中的定时任务是软件开发中一个非常重要的功能,它允许我们按照预定的时间间隔执行特定的任务,比如数据备份、日志清理、系统监控等。在Java中,我们可以利用`java.util.Timer`类和`java.util.TimerTask`类来实现...

    java实现的电梯仿真程序

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

Global site tag (gtag.js) - Google Analytics