过桥问题(Java递归)

该博客探讨了一个经典的算法问题——夜晚多人过桥,其中涉及一个手电筒和不同速度的人。通过编写Java代码,展示了如何找到使所有人过桥的最短时间。算法的关键在于每次让最快的两人先过桥,并确保手电筒能及时返回。
摘要由CSDN通过智能技术生成
过桥问题。有N(N≥2)个人在晚上需要从X地到达Y地,中间要过一座桥,过桥需要手电筒(而他们只有1个手电筒),每次最多两个人一起过桥(否则桥会垮)。
 N个人的过桥时间依次存入数组t[N]中,分别为:t[0],t[1], ……, t[N-1]。过桥的速度以慢的人为准!
 注意:手电筒不能丢过桥!问题是:编程求这N个人过桥所花的最短时间
public class Bridge {
    public static void main(String[] args) {
        ArrayList<Integer> a = new ArrayList<>();
        ArrayList<Integer> b = new ArrayList<>();
//        for (int i = 0; i < 1000; i++) {
//         a.add((int) (Math.random() * 100+1));
//        }
        a.add(1);
        a.add(2);
        a.add(5);
        a.add(10);

        System.out.println(bridge(a, b, 0));
    }

    public static int bridge(ArrayList<Integer> a, ArrayList<Integer> b, int sum) {
        if (a.size()<2){
          sum+=a.get(0);
          return sum;
        }
        //a中最快的先走
        sort(a);
        b.add(a.get(0));
        b.add(a.get(1));
        sum += a.get(0) < a.get(1) ? a.get(1) : a.get(0);
        a.remove(1);
        a.remove(0);
        if (a.size() == 0) {
            return sum;
        }
        //b中最快的返回
        a.add(b.get(0));
        sum += b.get(0);
        b.remove(0);
        //a中最慢两个的走
        sort(a);
        b.add(a.get(a.size() - 1));
        b.add(a.get(a.size() - 2));
        sum += a.get(a.size() - 1) < a.get(a.size() - 2) ? a.get(a.size() - 2) : a.get(a.size() - 1);
        a.remove(a.size() - 2);
        a.remove(a.size() - 1);
        if (a.size() == 0) {
            return sum;
        }
        //b中最快的返回
        a.add(b.get(0));
        sum += b.get(0);
        b.remove(0);
        b.remove(0);
        return bridge(a, b, sum);
    }

    public static void sort(ArrayList<Integer> arrayList) {
        arrayList.sort(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值