- 浏览: 467269 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
题目:小明过桥要一秒,小明的弟弟要三秒,小明的爸爸要六秒,小明的妈妈要八秒,小明的爷爷要十二秒。每次此桥最多可过两人,而过桥的速度,依过桥最慢者而定,可是灯在点燃后, 三十秒就会熄灭。那么,请问小明一家,如何在三十秒内过桥?
下面是个简单的实现,还没有进行代码优化,将一定时间范围内的过桥组合都打印出来
输出结果如下:
花费时间: 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
下面是个简单的实现,还没有进行代码优化,将一定时间范围内的过桥组合都打印出来
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
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 910面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6735本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2223本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1745尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2733本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2175正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3758本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1961问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3984题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3185题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8758EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3334题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6706面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9851Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1423个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2148从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7401for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4159本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2907本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
### 分支限定算法在Java中的应用与实现 #### 一、分支限定算法(Branch & Bound)简介 **分支限定算法**是一种解决组合优化问题的有效方法,尤其适用于解决那些解空间非常大的问题。它通过逐步缩小搜索范围来寻找...
将Java程序转换为Windows服务是通过JavaService工具实现的,这个工具允许Java应用程序在Windows操作系统中作为服务运行,从而在系统启动时自动启动程序,并且可以在服务管理器中进行管理。下面将详细讲解如何操作和...
用面向对象方法和面向对象程序设计语言,实现满足下述要求的一个高层建筑电梯活动 仿真程序。 问题域概述 某国际展览中心共 40 层,设有载客电梯10 部(用E0~E9 标识)。 限定条件 (1) 电梯的运行规则是: E0、E1...
### Java程序打包方案详解 #### 一、引言 在Java开发过程中,为了方便地部署和执行Java应用程序,经常需要将编写的Java源代码或类文件打包成可执行的格式。尤其是在Windows环境下,为了让非技术人员也能轻松运行...
Java程序设计在线考试系统是通过网络的形式来完成Java程序设计这门课的考试,通过信息化管理的方式实现试题、试卷、考试、批改以及成绩查询为一体的管理系统,提高了Java程序设计的考试效率,为试卷的批改和成绩的...
"高等教育自学考试_Java语言程序设计" Java语言程序设计是一门基础课程,旨在培养学生掌握Java语言的基本知识和技能。本节课程主要介绍Java语言的基础知识,包括Java语言的特点、执行过程、开发和运行Java程序的...
Java程序通常运行在Java虚拟机(JVM)上,但为了方便非Java开发人员或用户使用,有时我们需要将Java程序转换为可执行的Windows程序(.exe)。这可以通过一些第三方工具实现,例如`exe4j`和`Inno Setup`。这两个工具...
在IT行业中,尤其是在Windows操作系统环境下,我们经常需要执行一些Java程序。为了方便快捷地运行这些程序,我们可以将它们封装到批处理(.bat)文件中。这样,只需双击.bat文件,就可以自动调用Java虚拟机(JVM)...
本文将深入探讨如何使用Java的线程机制来实现程序执行的超时控制,同时也会涉及基本数据类型、反射以及它们在超时控制中的应用。 首先,我们要理解Java中的线程。线程是程序的执行单元,每个线程都有自己的执行路径...
在Java平台上,Service Provider Interface (SPI) 是一种允许第三方开发者扩展Java应用程序的机制。它使得开发者可以为已存在的服务提供自定义实现,而无需修改原始的代码。在Java的类库中,许多接口都利用了SPI,...
Java程序设计试卷主要涵盖Java语言的基础知识,包括类文件、编译、程序设计步骤、数据类型、流程控制结构、变量赋值、运算符优先级、类的构造与访问修饰符、对象创建、包的导入、构造方法命名规则、类成员限定词、...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java语言程序设计(郑莉)课后习题答案 Java语言程序设计是计算机科学领域中的一门重要学科,以下是对Java语言程序设计(郑莉)课后习题答案的知识点总结: 对象和类 * 对象是包含现实世界物体特征的抽象实体,它...
根据给定的文件信息,本篇文章将详细解析如何利用Java编程语言实现三门课程的平均分计算,并且通过三种不同的循环结构(for、while、do-while)来完成这一任务。此外,还将介绍如何利用Java中的`Math.random()`函数...
### 概观C++与Java程序设计语言的特征 随着计算机技术的发展,程序设计语言越来越多,其中C++和Java可以说是目前应用最为广泛的语言之一,这与其优良的特性密不可分。本文将着重探讨这两种程序语言的特征,分别总结...
在Java的`java.util.ServiceLoader`类中,SPI的实现方式得以体现。 在这个“java spi实现工程”中,我们可以看到一个简单的Java SPI应用实例。下面将详细讲解Java SPI的基本原理、使用步骤以及相关的关键组件。 1....
在上述脚本中,`MAIN_CLASS`是你的Java程序的主类名,需要替换为实际的全限定类名。`CLASSPATH`定义了Java程序的类路径,可以包含当前目录(".")和其他需要的JAR文件。`JAVA_OPTS`用于设置Java虚拟机(JVM)的参数...
在命令行中输入`java Test`,这里的`Test`是主类的全限定名(包括包名,如果没有指定包名,则默认为无名包),JVM会加载并执行`Test.class`中的`main`方法,这是Java程序的入口点。 `main`方法的定义如下: ```java...
2. **指定主类和JAR文件** - 明确指出Java程序的主类名(包含package的全限定类名)和JAR文件的位置。例如,使用`java -cp 或 -jar`选项来指定类路径或直接运行JAR文件。 3. **传递参数** - 如果Java程序需要接收...
Java中的定时任务是软件开发中一个非常重要的功能,它允许我们按照预定的时间间隔执行特定的任务,比如数据备份、日志清理、系统监控等。在Java中,我们可以利用`java.util.Timer`类和`java.util.TimerTask`类来实现...