题目:
过桥游戏:小明一家过一座桥,过桥的时候是黑夜,所以必须要有灯。现在小明过桥要2分钟,小明弟弟要5分钟,小明的爸爸要6分钟,小明妈妈要9分钟,小明爷爷要13分钟,每次此桥最多可以过两个人,而过桥的速度根据过桥最慢者而定, 而且灯在点燃后40分钟就熄灭,问小明一家如何过桥时间最短?
代码:
package cn.chetech.suanfa;
/**
* 过桥游戏:小明一家过一座桥,过桥的时候是黑夜,所以必须要有灯。现在小明过桥要2分钟,小明弟弟要5分钟,小明的爸爸要6分钟,
* 小明妈妈要9分钟,小明爷爷要13分钟,每次此桥最多可以过两个人,而过桥的速度根据过桥最慢者而定,
* 而且灯在点燃后40分钟就熄灭,问小明一家如何过桥时间最短? 变量 A,B,C,D,E 分析: 两种方案:(1)最快的可以把最慢的两个送过桥
* 第一步:A和E过桥,花费E分钟,A回来,花费A分钟,A和D过桥,花费D分钟,A回来,花费A分钟,总共花费时间 2A+D+E
* (2)最快的两个人把最慢的两个人送过桥
* 第一步:A和B先过桥,花费B分钟,A回来,花费A分钟,D和E过桥,花费E分钟,B回来,花费B分钟,共花费时间A+B+E+B
* 首先每一个人过桥的时间保存在数组里面,然后根据问题分析的过桥方案,4人及4人以上怎么过桥,3个人怎么过桥,2个人怎么过? A+2B+E +
* B+A+C=2A+3B+C+E = 4+15+6+13 = 38 分钟
*/
public class BridgeGame {
static String[] name = { "小明", "弟弟", "爸爸", "妈妈", "爷爷" };
static int[] time = { 2, 5, 6, 9, 13 };
/**
* 方案一:最快者将最慢的两个人送过桥 A,B,C,D,E
*/
static void step1(int a, int b, int d, int e) {
String pA = name[a]; // 获得人名
String pD = name[d];
String pE = name[e];
int tA = time[a];
int tD = time[d];
int tE = time[e];
System.out.println(pA + "和" + pE + "过桥,花费" + tE + "分钟。");
System.out.println(pA + "回来,花费" + tA + "分钟。");
System.out.println(pA + "和" + pD + "过桥,花费" + tD + "分钟。");
System.out.println(pA + "回来,花费" + tA + "分钟。");
}
/**
* 方案一:最快的两个人将最慢的两个人送过桥 A,B, C, D,E
*/
static void step2(int a, int b, int d, int e) {
String pA = name[a]; // 获得人名
String pB = name[b];
String pD = name[d];
String pE = name[e];
int tA = time[a];
int tB = time[b];
int tE = time[e];
System.out.println(pA + "和" + pB + "过桥,花费" + tB + "分钟。");
System.out.println(pA + "回来,花费" + tA + "分钟。");
System.out.println(pD + "和" + pE + "过桥,花费" + tE + "分钟。");
System.out.println(pB + "回来,花费" + tB + "分钟。");
}
/**
* 有三个人过桥
*/
static void step3(int a, int b, int c) {
System.out.println(name[a] + "和" + name[b] + "过桥,花费" + time[b] + "分钟。");
System.out.println(name[a] + "回来,花费" + time[a] + "分钟。");
System.out.println(name[a] + "和" + name[c] + "过桥,花费" + time[c] + "分钟。");
}
/**
* 有两个人过桥
*/
static void step4(int a) {
System.out.println(name[0] + "和" + name[a] + "过桥,花费" + time[a] + "分钟。");
}
public static void main(String[] args) {
int n = 5; // 总人数
int sum = 0; // 花费总时间
int i;
// 人多时,根据方案,先送两人过桥
for (i = n - 1; i > 2; i = i - 2) {
// 最快的两个人将最慢的两个人送过桥 两种方案时间比较 A+B+B+E < 2A+D+E
if (time[0] + time[1] + time[1] + time[i] < time[0] + time[0] + time[i - 1] + time[i]) {
sum = sum + time[0] + time[1] + time[1] + time[i];
step2(0, 1, i - 1, i);
} else {
// 最快者将最慢的两个人送过桥
sum = sum + time[0] + time[0] + time[i - 1] + time[i];
step1(0, 1, i - 1, i);
}
}
// 三人过桥
if (i == 2) {
sum = sum + time[0] + time[1] + time[2];
step3(0, 1, 2);
}
// 2人过桥
if (i == 1) {
sum = sum + time[1];
step4(1);
}
System.out.println("最短过桥时间:" + sum + " 分钟。");
}
}
结果:
小明和弟弟过桥,花费5分钟。
小明回来,花费2分钟。
妈妈和爷爷过桥,花费13分钟。
弟弟回来,花费5分钟。
小明和弟弟过桥,花费5分钟。
小明回来,花费2分钟。
小明和爸爸过桥,花费6分钟。
最短过桥时间:38 分钟。