1. 程式人生 > >Java過橋遊戲程式碼實現

Java過橋遊戲程式碼實現

題目:

過橋遊戲:小明一家過一座橋,過橋的時候是黑夜,所以必須要有燈。現在小明過橋要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 分鐘。