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

解决方案 »

  1.   

    假设四个人是A, B, C, D,过桥时间分别为1,2,5,10。 目前四个人都在桥的左端 L,目的是用最短时间到达桥的右端 R。
    1. A,B先过桥,花费2分钟
    2. A带手电筒返回L, 花费1分钟
    3. C,D带手电筒过桥,花费10分钟
    4. B返回L接A,花费2分钟
    5. A, B一起过桥,花费2分钟共花时间2+1+10+2+2=17分钟,这个应该是最短时间。
    我的思路是:
    1. A,B过桥时间最短,应尽量让其承担往返传递手电筒的任务
    2. C,D过桥时间最长,应让其过桥次数尽量少lz要求用面向对象和面向过程两种思想分别设计方案求得最优解,考虑中......
      

  2.   

    下次你发到非技术区,此题答案:http://www.java2000.net/p11063
    更多的智力面试题:http://www.java2000.net/f581
      

  3.   


    public class readPro 
    {
        
        public static void main(String[] args) throws IOException 
        {
            Properties pro = new Properties();
            FileInputStream fis = new FileInputStream("pro.properties");
            pro.load(fis);
        }}试一下怎么贴代码,呵呵
      

  4.   

    import java.util.Arrays;public class Main {    private final int[] timeLookup;     public Main(int[] timeLookup) {
            this.timeLookup = timeLookup;
            Arrays.sort(this.timeLookup);
        }
        
        public int findMinTime() {
         if (timeLookup.length == 1) {
         return timeLookup[0];
         }
            return findMinTime((1 << timeLookup.length) - 1);
        }
        
        private int findMinTime(int status) {
            
            int min = Integer.MAX_VALUE;
            
            // 选择第一位过河的人
            for (int i = 1; i < 4; i++) {
                if ((status & (1 << i)) == 0) {
                    continue;
                }
                
                // 选择第二位过河的人
                for (int j = 0; j < i; j++) {
                    if ((status & (1 << j)) == 0) {
                        continue;
                    }
                    
                    // 计算过河后的状态
                    int nextStatus = status ^ (1 << i) ^ (1 << j);
                    
                    // 计算过河所需时间
                    int time = timeLookup[i];
                    
                    if (nextStatus == 0) {
                        return time;
                    }
                    
                    // 选择返回的人
                    int k = 0;
                    while (((nextStatus >> k) & 1) == 1) {
                        k++;
                    }
                    
                    // 计算返回后的状态
                    nextStatus |= (1 << k);
                    
                    // 计算返回所需时间
                    time += timeLookup[k];
                    
                    // 进行下一轮
                    time += findMinTime(nextStatus);
                    
                    // 记录最短时间
                    if (time < min) {
                        min = time;
                    }
                }
            }
            return min;
        }    public static void main(String[] args) {
            System.out.println(new Main(new int[] { 1, 2, 5, 10 }).findMinTime());
        }    
    }