Java過橋遊戲程式碼實現
阿新 • • 發佈:2018-12-17
題目:
過橋遊戲:小明一家過一座橋,過橋的時候是黑夜,所以必須要有燈。現在小明過橋要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 分鐘。