阿里在线笔试题

题目如下:

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

输入示例: 

2,2 
2,8 
4,4 
7,2 
输出: 
30

拿到这道题首先要分析题目,要求最短派送的路线,可以遍历出所有路径一一对比,也可以采用回溯算法。

 

 1 import java.util.Scanner;
 2 
 3 //定义一个坐标类
 4 class Point{
 5     //(x,y)坐标
 6     int x,y;
 7     //判断是否遍历过的标志变量
 8     boolean isVisited;
 9     
10     //构造函数
11     public Point(int x, int y) {
12         this.x = x;
13         this.y = y;
14         this.isVisited = false;//初始化为false,若遍历过则置为true 
15     }
16     
17     //获得该点到指定点的距离
18     public int getLength(Point p) {
19         return Math.abs(x-p.x) + Math.abs(y-p.y);
20     }
21 }
22 
23 //处理最短路径的方法类
24 public class Method{
25     //起始点
26     static Point  StartPoint = new Point(0, 0);
27     //最小路径先设为系统最大值
28     static int minPath = Integer.MAX_VALUE;
29     
30     /**
31      * 定义获取给定点到其余点的最小路径的方法,递归调用
32      * @param point        给定的起始点
33      * @param points    其余的点
34      * @param totalLen    起始点到遍历点的距离和
35      * @param count        用来对遍历过的点计数
36      * @return
37      */
38     public static int caculate(Point p, Point[] points, int totalLen, int count) {
39         //判断停止条件,如果所有的点遍历完,则返回
40         if(points.length==count) {
41             minPath = Math.min(minPath, totalLen + p.getLength(StartPoint));
42             return minPath;
43         }
44         
45         //否则遍历其余的点并进行路径和的计算
46         for(int i=0; i<points.length; i++) {
47             //判断此点是否遍历过
48             if(points[i].isVisited==false) {
49                 //计算起始点到遍历点之间的距离,从而更新最小路径
50                 totalLen += points[i].getLength(p);
51                 
52                 //若小于最小路径,则更遍历此点继续下一步
53                 if(totalLen<minPath) {
54                     //该点的标志位置为true
55                     points[i].isVisited = true;
56                     //每遍历一个点,计数器加1,起始点更改为遍历后的点,继续计算其余点
57                     caculate(points[i], points, totalLen, count+1);
58                 }
59                 //将路径和倒减,标志置为false,进行下一个方案的计算
60                 totalLen -= points[i].getLength(p);;
61                 points[i].isVisited = false;
62             }
63         }
64         return minPath;
65     }
66     
67     public static void main(String[] args) {
68         int totalLen = 0, count = 0;
69         //从键盘获取输入
70         Scanner input = new Scanner(System.in);
71         int num = Integer.parseInt(input.nextLine());
72         int n = num;
73         Point[] points = new Point[n];
74         //获得输入点的坐标并存入坐标数组中
75         for(int i=0; i<points.length; i++) {
76             String[] strings = input.nextLine().trim().split(",");
77             points[i] = new Point(Integer.parseInt(strings[0]), Integer.parseInt(strings[1]));
78         }
79         
80         //计算最优路径并打印到控制台
81         minPath = caculate(StartPoint, points, totalLen, count);
82         System.out.println(minPath);
83     }
84 }
85 
86 /*
87  * 以上代码参考https://blog.csdn.net/s_yj_q/article/details/81132765, 如有错误,各路大神多多指教。
88  */
View Code

 

posted @ 2018-08-19 21:25  CiaoBello  阅读(6649)  评论(1编辑  收藏  举报