• 阿里在线笔试题


    题目如下:

    如下图,某物流派送员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
  • 相关阅读:
    Splashtop :符合 HIPAA 标准的远程桌面软件
    学生如何在家中访问学校许可的软件
    Splashtop用于远程实验室的功能得到增强
    docker环境安装,镜像和容器常用命令
    vue-cli入门
    webpack快速入门
    Vue路由vue-router
    Vue组件化
    Vue指令
    Vue实例
  • 原文地址:https://www.cnblogs.com/ciaociao/p/9502748.html
Copyright © 2020-2023  润新知