夜晚,桥头有 4个人在一起准备过桥,这些人中只有一个人有手电筒,从桥头走到桥尾一次最多只能俩个人同时行进,每个人单独过桥的时间可能不一样,如果两个人在一起走,则这次的花费时间是走的最慢的那个人,假如现在四个人单独过桥的时间分别是 1,2,5,7,将它们放在一个数组中{1,2,5,7}算出最少的过桥时间。
问题解析:这个问题可以用递归解决。定义俩个指针,i和j,这俩个指针只能向前遍历。i从数组的第i位开始挑出一个人,j是在数组挑出第i位之后再从数组中挑出的人,这样就遍历了数组内各种情况的组合。在从四个人中随便抽出俩个过桥,此时从桥尾选出一个耗时最少的人重新回到桥头,这时候就成了3人过桥的问题,3人过桥又是找出各种组合过桥,最终就剩下俩个人在桥头,这时候俩个人就直接过桥,不用再进行组合过桥。可见俩个人过桥就是递归的出口。
以下是代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class FourMenPassBridge {
public static void main(String[] args) {
int[] source = {1,2,5,7};
FourMenPassBridge pass = new FourMenPassBridge();
pass.setSrc(source);
pass.passBridge(pass.getSrc(), pass.getDes(), 0);
int min = pass.result.get(0);
for(int i = 0;i
result = new ArrayList
();
public static int count=0;
public FourMenPassBridge(){
des = new Vector();
src = new Vector();
}
public void setSrc(int[] array){
for(int i = 0;i
=3){
for(int i = 0;i
以下是运行结果:先列举出各种情况,最后判断出最少的时间
入口:src-[1, 2, 5, 7]des-[]
i=0-1,j=1-2
先这俩个人过去:1和2
这时从桥尾回来的是:1
[5, 7, 1]des+[2]
入口:src-[5, 7, 1]des-[2]
i&