题目描述:某物流派送员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));
}
}