题目描述
派送员在地图的(0,0)位置,地图的边城都为1,给出几个位置(点),请问派送员送餐的最短往返距离距离(送完所有位置的行走最短距离+最后送完的位置到0,0的距离)。
思路:采用递归。找出所有情况。
代码如下:
package 秋招练习;
import java.util.Scanner;
public class 派送员 {
//递归
static int res=Integer.MAX_VALUE;//最终结果
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
Point[] points=new Point[n];
boolean[] flag=new boolean[n];
for(int i=0;i<n;i++){
String[] s=in.next().split(",");
int x=Integer.valueOf(s[0]);
int y=Integer.valueOf(s[1]);
points[i]=new Point(x, y);
}
getRes(points, 0, 0, flag, 0, 0);
System.out.println(res);
}
//参数介绍:points为点的集合,index为走了多少个地方的----就一个计数器,sum为目前走了多少距
//离,flag数组为已经走了那些地方,x, y为当前的坐标
public static void getRes(Point[] points,int index,int sum,boolean[] flag,int x,int y){
if(index==points.length){//表示所有地方走完了。更新res变量
res=Math.min(res, sum+Math.abs(x)+Math.abs(y));
return ;
}
for(int i=0;i<points.length;i++){
if(!flag[i]){
//走过的地方更新为true
flag[i]=true;
//更新距离。
sum+=Math.abs(points[i].x-x)+Math.abs(points[i].y-y);
getRes(points, index+1, sum, flag,points[i].x, points[i].y);
//递归结束要退回来,好让其他的递归操作这个数组。
flag[i]=false;
}
}
}
}
题目测试数据:
输入:
4
2,2
2,8
4,4
7,2
输出:
30
输入范例:
3
2,2
2,8
6,6
输出范例:
28
记录这一时刻。成长的一第一步。