收费公路重建问题--回溯算法 JAVA实现

问题描述:
设给定N个点p1,p2,…,pN位于x轴上,xi为pi的坐标,假设x1=0且这些点从左至右分布。则每一对点之间都对应一个距离|xi,xj|, (i≠j),共计有N(N-1)/2对点产生的距离。 收费公路重建问题是从这些距离重新构造出点集。
简单举例:
设D是距离的集合,并设D={1,2,2,2,3,3,3,3,4,5,5,5,6,7,8,10}。D包含15个元素,因此点集大小N=6。初始设x1=0,进而x6=10。
算法思路:
收费公路重建问题属于回溯算法。因此当我们发现某一x的位置设置不合理时,会撤销该位置,并进一步尝试另外的坐标,而不是完全推到重来。
我们实现回溯的方法是递归。传递同样的参数以及界Left和Right;这两界是我们试图放入的xi的序号。如果D是空集,那么解已经找到,否则继续递归。
在本问题中,我们按照距离大小由大到小的选择xi的位置,因为距离最大只有两个选项,离左端最远和离右端最远。我们首先尝试在右侧找出符合要求的点即使Xright=Dmax(即新点距左端X1的距离为Dmax),如果已经确定的点与当前点的距离都包括在集合D內。那么尝试性的放上这一点,删除相应的距离,并尝试将界改为Left和Right-1,继续递归。如果这些距离不包括在集合D內,或者新一步的递归不成功,那么,递归层层返回,并还原之前删除的集合D中的距离。这一轮递归结束后,再从左侧尝试Xleft = Xn-Dmax(即新点距X6的距离为Dmax)。如果仍然不符条件,则没有这样的分布。

import java.util.Arrays;

public class BackTracking {
   

// 接收点的数组x,距离的集合d,点的数量n
    public static boolean turnpike(int[] x,DistSet d,int n ){
   
        x[1] = 0;
        x[n] = d.deleteMax();
        x[n-1] = d.deleteMax();
        if (d.contains(x[n]-x[n-1])){
   
            d.remove(x[n]-x[n-1]);
            return place(x,d,n,2,n-2);

        } else return false;
    }
    public static boolean place (int[] x, DistSet d, int n,int left,int right){
   
        int dmax;
        boolean found = false;

        if (d.d.isEmpty())
            return true;
        dmax = d.findMax();
        //用于判断新的x加在左侧还是右侧
        //因为确定的数分布在左右两侧,因此各需一个布尔变量。又要判断新点在最左侧还是最右侧,所以共需4个布尔变量
        boolean rightside1 = true;
        boolean leftside1 = true;
        boolean rightside2 = true;
        boolean leftside2 
Java 是一种广泛使用的编程语言,非常适合用于实现高速公路收费系统。该系统由计费模块和收费模块组成,计费模块负责计算车辆路程并生成账单,而收费模块则负责收取费用和管理账单。 首先,我们需要为车辆设置识别码,以便识别每辆车的行驶路程。这可以通过安装电子标签或摄像头识别车牌号码来实现。接着,我们可以编写一段代码,来为每次经过收费站的车辆记录下进站时间和进站里程数,并通过减法计算出出站里程数和行驶距离。根据车型和行驶距离的不同,我们可通过计费规则来计算每辆车的行驶费用。 收费模块负责收取费用,并可用账单管理功能管理所有车辆的费用信息。我们可通过编写一个计费表格,以便在不同的收费站采用相同的计费标准。一旦车辆到达收费站,系统就会自动查询其账单,并计算出应付费用。一旦用户支付费用,系统就会更新账单和收据,并自动扣除用户账户中的相应金额。需要注意的是,系统还需要确保每个车辆只交纳了一次费用,因此在收费过程中要进行严格的排队和支付控制。 此外,我们还可考虑使用一些高级工具,如数据库和网络连接,来进一步加强系统功能。使用数据库可实现对车辆信息和账单的更加高效和精确的管理。通过网络连接,我们可将账单信息传递给其他的交通管理系统和金融系统,从而实现更加全面和高效的服务。 Java 实现高速公路收费系统涉及到多个模块和技术,需要有严谨的设计和测试,以确保系统的可靠性和准确性。通过不断优化和升级,我们可使系统更加智能化和用户友好化,为用户提供更加便捷和高效的服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值