- 浏览: 460661 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 857面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6675本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2182本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1691尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2663本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2108正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3707本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1926问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3946题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3121题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8712EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3288题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6661面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9805Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1379个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2107从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7360for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4077本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2845本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
Java程序设计在线考试系统是通过网络的形式来完成Java程序设计这门课的考试,通过信息化管理的方式实现试题、试卷、考试、批改以及成绩查询为一体的管理系统,提高了Java程序设计的考试效率,为试卷的批改和成绩的...
分支限定算法JAVA,此文件是是pdf格式,讲述了怎么建立class.和function
Java语言程序设计 基础篇 第10版,程序清单12_1~6,懒癌晚期限定
用面向对象方法和面向对象程序设计语言,实现满足下述要求的一个高层建筑电梯活动 仿真程序。 问题域概述 某国际展览中心共 40 层,设有载客电梯10 部(用E0~E9 标识)。 限定条件 (1) 电梯的运行规则是: E0、E1...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
java通过线程控制程序执行超时(新) 基本数据类型 反射 线程 超时
java swing 实现的电梯模拟系统,能够通过界面方式简易模拟电梯的运行,管理员登录,设置等基本功能!附有开发文档,程序代码和界面的一些图片,开发环境为:JCreator,一些功能还未实现,希望给你一点借鉴,并希望你...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java源码...
Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都在压缩包内。 Java zip压缩包查看程序源码 1个目标文件 摘要:Java...
5 开发与运行JAVA程序需要经过的三个主要步骤为 编写源程序 , _____________和 ______________。 6 JAVA中类成员的限定词有以下几种:public , __________ ,默认和private。其中, __________ 的开放范围最小。
VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限VisualC 实效编程 120 限定程序的使用时限...
9、Java中类成员的限定词有以下几种:private, _protected__, public__, 默认友好。 10、基类的公有成员在派生类中的访问权限由_基类___决定。 11、用static修饰的方法,称为静态方法。它们不是对象的方法,...
设计一个矩阵相乘的Strassen算法编程实现并做算法的时间复杂性分析。 其中:乘积矩阵C = A*B, A=(aij)n*n,B=(bij)n*n (1)考虑n为2的幂次方的情形,取n=8实现分治递归; (2)考虑n不是2的幂次方,n为偶数的...
日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
学校Java专题训练的题目,实现了存取款、查询余额、密码修改及转账功能。在设计时,限定了其只能对100元的人民币进行操作。
备注: 可直接下载文件夹“代码”,然后执行“pintu.java”程序 说明文档在README.md中 安装与初始化 解压pintu.zip压缩包; ...使用Sublime text运行pintu.java文件;...图片在限定区域内的移动。
用java写的聊天器,限定在局域网中实现