经典面试智力题(过桥问题)及完整java代码

    技术2022-05-11  70

    在一家公司笔试碰到的,当时由于时间紧没有做出来,估计没有什么希望了。回到家里写了一个完整的程序,希望对以后的人有所帮助吧。(注 网上也有一些类似的例子,感觉那些写的不是很好,不是很切题)

    问题描述:在漆黑的夜里,五位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无 论如何也不敢过桥去的。不幸的是,五个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是1、2、5、8、10分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这四人尽快过桥,并用java程序描述。

    程序如下:

     

    public   class  PastBridge  {    public static void main(String[] args) {        // 假设数组从小到大排序        int[] example1 = 12510 };        String[] strExample1 = "A""B""C""D" };        int[] example2 = 1101112};        String[] strExample2 = "A""B""C""D"};        int[] example3 = 1};        String[] strExample3 = "A"};        int[] example4 = 1,3};        String[] strExample4 = "A","B"};        int[] example5 = 1,3,6};        String[] strExample5 = "A","B","C"};        GoBridge(example1, strExample1);        GoBridge(example2, strExample2);        GoBridge(example3, strExample3);        GoBridge(example4, strExample4);        GoBridge(example5, strExample5);    }    /**     * 计算所有人过桥的总用时     *     * @param personTimes     *            过桥人各自所用时间组成的数组     * @param personNames     *            过桥人名称组成的数组     */    private static void GoBridge(int[] personTimes, String[] personNames) {        int personsNum = personTimes.length;        if(personsNum==1){            System.out.println("总共用时=" + personTimes[0]);            return;        }        if(personsNum==2){            System.out.println("总共用时=" + personTimes[1]);            return;        }        int quickest = personTimes[0];// 用时最少的人        int quicker = personTimes[1]; // 用时第二少的人        int totalTimes = 0;// 总共用时        // 将执行逻辑按是否为偶数分成两种情况        boolean isEvenNum = personsNum % 2 == 0;        if (isEvenNum) {// 为偶数            for (int i = personTimes.length - 1; i >= 2;) {                totalTimes +=goBridgerControl(i, personNames,personTimes);                i = i - 2;            }            totalTimes += quicker;            System.out.println(personNames[0+ "," + personNames[1+ "过去 用时:"+personTimes[1]);        } else {// 为奇数            for (int i = personTimes.length - 1; i > 3;) {                totalTimes +=goBridgerControl(i, personNames,personTimes);                i = i - 2;            }            totalTimes += personTimes[2];            totalTimes += quicker + quickest;            System.out.println(personNames[0+ "," + personNames[2+ "过去 用时:"+personTimes[2]);            System.out.println(personNames[0+ "回来 用时:"+personTimes[0]);            System.out.println(personNames[0+ "," + personNames[1+ "过去 用时:"+personTimes[1]);        }        System.out.println("总共用时=" + totalTimes);    }    /**     * 执行路径的控制选择     * @param i     * @param personNames     * @param personTimes     * @return     */    private static int goBridgerControl(int i, String[] personNames,int[] personTimes) {        if(personTimes[1]*2<personTimes[0]+personTimes[i-1]){            return goBridgerWith2(i, personNames,personTimes);        }else{            return goBridgerWith1(i, personNames,personTimes);        }    }    /**     * 最快和次最快的人陪同过桥     * @param i     * @param personNames     * @param personTimes     * @return     */    private static int goBridgerWith2(int i, String[] personNames,int[] personTimes) {        System.out.println(personNames[0+ "," + personNames[1+ "过去 用时:"+personTimes[1]);        System.out.println(personNames[0+ "回来 用时:"+personTimes[0]);        System.out.println(personNames[i] + "," + personNames[i - 1+ "过去 用时:"+personTimes[i]);;        System.out.println(personNames[1+ "回来 用时:"+personTimes[1]);        int roundedTimes = personTimes[1* 2 + personTimes[0];// 用时最少的两位往返的时间和        int atotalTimes=0;        atotalTimes+= personTimes[i];        atotalTimes+= roundedTimes;        return atotalTimes;    }    /**     * 最快的人陪同过桥     * @param i     * @param personNames     * @param personTimes     * @return     */    private static int goBridgerWith1(int i, String[] personNames,int[] personTimes) {        System.out.println(personNames[0+ "," + personNames[i] + "过去 用时:"+personTimes[i]);        System.out.println(personNames[0+ "回来 用时:"+personTimes[0]);        System.out.println(personNames[0+ "," + personNames[i - 1+ "过去 用时:"+personTimes[i-1]);;        System.out.println(personNames[0+ "回来 用时:"+personTimes[0]);        int atotalTimes=0;        atotalTimes+= personTimes[i];        atotalTimes+= personTimes[i-1];        atotalTimes+= personTimes[0]*2;        return atotalTimes;    }}

    如用更好的方式请告诉我,谢谢

     


    最新回复(0)