在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。假如不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。假如各自单独过桥的话,四人所需要的时间分别是1、2、5、10分钟;而假如两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,分别用面向对象和面向过程如何设计方案,让这四人尽快过桥。
调试欢乐多
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要求用面向对象和面向过程两种思想分别设计方案求得最优解,考虑中......
更多的智力面试题:http://www.java2000.net/f581
public class readPro
{
public static void main(String[] args) throws IOException
{
Properties pro = new Properties();
FileInputStream fis = new FileInputStream("pro.properties");
pro.load(fis);
}}试一下怎么贴代码,呵呵
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());
}
}