送快递的最短路线

 题目描述:某物流派送员p,需要给a、b、c、d4个快递点派送包裹,请问派送员需要选择什么的路线,才能完成最短路程的派送。假设如图派送员的起点坐标(0,0),派送路线只能沿着图中的方格边行驶,每个小格都是正方形,且边长为1,如p到d的距离就是4。随机输入n个派送点坐标,求输出最短派送路线值(从起点开始完成n个点派送并回到起始点的距离)。

首先拿到题目后思考问题,跟背包 问题很像,有许方案多的方案,从中获取最优的,采用回溯法求解。假设有三个送货地点,从(0.0)开始,直到三个点全部送完,记录最小的路线,然后从

0.1.2.3---------0.1.3.2

0.2.1.3---------0.2.3.1

0.3.2.1---------0.3.1.2

三个送货点的话六条路线,从中选最小的路线。

class Point{
    int x;
    int y;
    boolean visted;
    public Point(int x,int y){
        this.x=x;
        this.y=y;
        this.visted=false;
    }
    public int getLength(Point point){
        return Math.abs(x-point.x)+Math.abs(y-point.y);
    }
 
}
 
public class Main {
   static  Point Start=new Point(0,0);
   static  int minPath=Integer.MAX_VALUE;
    public static int caculate(Point start, Point[] points, int sum, int count){
        if(count==points.length){
             minPath=Math.min(minPath,sum+start.getLength(Start));
            return minPath;
            //所以的点都遍历完之后返回最小的路径
        }
        for(int i=0;i<points.length;i++){
           if(points[i].visted==false){
               sum+=points[i].getLength(start);
               if(sum<minPath){
                   points[i].visted=true;
                   caculate(points[i],points,sum,count+1);
               }
               sum-=points[i].getLength(start);
               points[i].visted=false;
 
           }
 
        }
        return minPath;
 
    }
 
    public static void main(String[] args){
 
        int   sum=0,count=0;
        Scanner input=new Scanner(System.in);
        int num=Integer.parseInt(input.nextLine());
        int num=3;
        Point[] points=new Point[num];
       for(int i=0;i<num;i++){
            String str[]=input.nextLine().trim().split(",");
            points[i]=new Point(Integer.parseInt(str[0]),Integer.parseInt(str[1]));
        }
       
        System.out.print(caculate(Start,points,sum,count));
    }
}

参考自Lolita1997 的文章

猜你喜欢

转载自blog.csdn.net/qq_28202661/article/details/81541467