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

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

问题描述:在漆黑的夜里,五位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无 论如何也不敢过桥去的。不幸的是,五个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,四人所需要的时间分别是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;

    }

}

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

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值