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 分钟。

猜你喜欢

转载自blog.csdn.net/baidu_37038557/article/details/83270411
今日推荐