问题:小明一家过一座桥,过桥的时候是黑夜,所以必须有灯。现在小明过桥要 2 分钟,小明 的弟弟要 5 分钟,小明的爸爸要 6 分钟,小明的妈妈要 9 分钟,小明的爷爷要 13 分钟。每次 此桥最多可以过两人,而过桥的速度根据过桥最慢者而定,而且灯在点燃后 40 分钟就会熄灭。 问小明一家如何过桥时间最短?

代码如下:

public class demo {static int index;                            //过桥临时方案的数组下标static int size = 64;static int N = 5;static int mintime = 40;                    //最小过桥时间总和,初始值30static int[] transit = new int[size];        //进行下标中转的数组static int program[] = new int[size];         //最短时间内过桥的方案;//    static int time[] = {1, 3, 6, 8, 12};         //每个人过桥所需要的时间;static int time[] = {2, 5, 6, 9, 13};         //每个人过桥所需要的时间;/** 将人员编号:小明 location[0],弟弟location[1],* 爸爸location[2],妈妈location[3],爷爷location[4] 每个人的当前位置:0--在桥左边, 1--在桥右边*/static int location[] = new int[N];/** 参数说明:notPass:未过桥人数;usedtime:当前已用时间;Direction:过桥方向,1--向右,0--向左*/public static void Find(int notPass, int usedtime, int Direction) {if (notPass == 0) {                 //所有人已经过桥,更新最少时间及方案mintime = usedtime;for (int i = 0; i < size && transit[i] >= 0; i++) {program[i] = transit[i];}} else if (Direction == 1) {         //过桥方向向右,从桥左侧选出两人过桥for (int i = 0; i < N; i++) {if (location[i] == 0 && (usedtime + time[i]) < mintime) {transit[index++] = i;location[i] = 1;for (int j = 0; j < N; j++) {int TmpMax = (time[i] > time[j] ? time[i] : time[j]);if (location[j] == 0 && (usedtime + TmpMax) < mintime) {transit[index++] = j;location[j] = 1;Find((notPass - 2), (usedtime + TmpMax), 0);location[j] = 0;transit[--index] = -1;}}location[i] = 0;transit[--index] = -1;}}} else { //过桥方向向左,从桥右侧选出一个人回来送灯for (int j = 0; j < N; j++) {if (location[j] == 1 && usedtime + time[j] < mintime) {transit[index++] = j;location[j] = 0;Find(notPass + 1, usedtime + time[j], 1);location[j] = 1;transit[--index] = -1;}}}}public static void main(String[] args) {String s1 = "", s2 = "", s3 = "";for (int i = 0; i < size; i++) {program[i] = -1;transit[i] = -1;                //初始方案内容为负值,避免和人员标号冲突}Find(N, 0, 1); // 查找最佳方案System.out.println("最短过桥时间为:" + mintime);        //输出最短过桥时间System.out.println("最佳过桥组合为:");                // 输出最佳过桥组合for (int i = 0; i < size && program[i] >= 0; i += 3) {switch (program[i]) {case 0:s1 = "小明";break;case 1:s1 = "弟弟";break;case 2:s1 = "爸爸";break;case 3:s1 = "妈妈";break;case 4:s1 = "爷爷";break;}switch (program[i + 1]) {case 0:s2 = "小明";break;case 1:s2 = "弟弟";break;case 2:s2 = "爸爸";break;case 3:s2 = "妈妈";break;case 4:s2 = "爷爷";break;}switch (program[i + 2]) {case 0:s3 = "小明";break;case 1:s3 = "弟弟";break;case 2:s3 = "爸爸";break;case 3:s3 = "妈妈";break;case 4:s3 = "爷爷";break;case -1:s3 = "没人";break;}System.out.println(s1 + "和" + s2 + "一道过桥," + s3 + "再回来");}}
}

执行结果如下:

思维拓展:用java实现巧妙过桥问题相关推荐

  1. 思维导图Java篇(一)

    思维导图Java篇(一) 思维导图Java篇(二) 思维导图Java篇(三) 思维导图Java篇(四) 思维导图Java篇(五) 思维导图Java篇(六) 思维导图Java篇(一)

  2. 数据结构思维导图——Java版

    数据结构思维导图--Java版

  3. 连连看游戏思维拓展(java版)

    文章目录 一.前言 二.思路分析 2.1,相同的卡片可以消除 2.2,两张卡片间连线的拐弯不能超过两个 1)两个节点是否可以直接相连 2)如果否,则考虑能否通过2条直线相连 3)如果否,则考虑3条直线 ...

  4. JAVA的思维逻辑_[Java教程]计算机程序的思维逻辑

    [Java教程]计算机程序的思维逻辑 0 2016-04-15 20:00:04 程序大概是怎么回事 计算机就是个机器,这个机器主要由CPU.内存.硬盘和输入输出设备组成.计算机上跑着操作系统,如Wi ...

  5. java基础入门第二版思维导图,Java 学习--你应该有份思维导图了(基础篇)

    每一门知识,除了理解它的一些原理用法之外,我觉得还有一点比较重要,那就是多整理笔记做总结. 以下是我自己亲自整理的关于 Java 学习的思维导图,分享出来希望能对大家在学习 Java 过程中有所帮助, ...

  6. c语言小红今年12岁小明13岁,一年级思维拓展题.docx

    一年级数学思维训练题 1.小红有15本书,小东有5本书,小红给小东( )本书,两个人的书就同样多? 2.一头猪换2只羊,一只羊换4只兔,2只羊换( )只兔,1头猪换( ) 只兔 3. 按规律填数字 ( ...

  7. 171025—例题分析 思维拓展

    一. 今日习题课.所谓习题,无非是出一些在实际操作中几乎用不到的东西来考察你对基础知识的掌握程度. 比如: I think that that that that that boy writes is ...

  8. 二分搜索法(思维拓展)

    定义: 二分搜索法,是通过不断缩小解可能存在的范围,从而求得问题最优解的方法. 简单用途: 从有序数组中查找某个值,这是一开始学习二分搜索的经典例子. 拓展用途: 用于求最优解的问题,如:满足某个条件 ...

  9. 【写方案攻略】一些实用性方案思维拓展结构图

  10. 字符串乘一个数_【思维拓展】三位数乘两位数,构造最大积和最小积

    前面袁老师给大家讲了一个重要结论,并运用这个结论来解决问题,构造两位数乘两位数最大积和最小积的问题. 今天,更进一步,三位数乘两位数中,如何构造最大积和最小的积? [问题引入] 用9.8.6.5.4这 ...

最新文章

  1. “解决方案资源管理器”中不能自动选择正在编辑的文档
  2. 计算机网络中st是什么,计算机组成中ST 是指什么
  3. JUC——线程同步锁(ReentrantLock)
  4. ML之SVM:基于sklearn的svm算法实现对支持向量的数据进行标注
  5. 【AWSL】之Linux账号和权限管理(/etc/passwd、/etc/shadow、useradd、passwd、usermod、groupadd、gpasswd...chmod、chown)
  6. 氩焊机器人编程_谈一谈铝合金的脉冲MIG焊
  7. 剑指offer(C++)-JZ82:二叉树中和为某一值的路径(一)(数据结构-树)
  8. MySQL中IN子查询会导致无法使用索引
  9. 09. 利用destructors避免泄漏资源
  10. Python入门之面向对象module,library,package之间区别
  11. update-apt-xapian-index 意外关闭
  12. 在线php网站扫描,一个简单的php在线端口扫描器
  13. The `certs(%1$s)` contains the merchant‘s certificate serial number(%2$s) which is not allowed here.
  14. Win10预览版之BUG
  15. 微信小程序 防连点时间_微信小程序如何避免按钮多次点击重复触发事件
  16. ZYF loves binary(dp)
  17. 程序设计比赛WBS图
  18. mysql忘记root密码拯救方法(flush privileges)
  19. 在Java代码中设置布局/控件
  20. 聊天机器人技术分析综述

热门文章

  1. AsyncTask异步加载给视频截取第一帧图片
  2. 盛世乐居回应近期股价波动
  3. 那些所倚靠的利器记载
  4. python基础之logging模块
  5. 怎么搭建百度网盘目录搜索网站?网盘目录#百度网盘
  6. 微信更新版本下载链接汇总【持续更新】
  7. php选课实验成品_PHP基于B/S模式下的学生选课管理系统、源码分享
  8. python数据分析与应用第四章实训答案_《python数据分析与应用》第四章:pandas统计分析基础...
  9. 2022「博客新星」年度评选TOP100名单
  10. Windows 缓冲区溢出与数据执行保护DEP