8.理想火车站定位

79 阅读2分钟

问题描述

小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| + |y1 - y2|,即曼哈顿距离。

在初步考察后,市政府列出了M个可能的火车站建设点。为了使得市民到火车站的总旅行时间最短,小F希望选出一个最优位置作为火车站的地址。

请你帮助小F计算出哪一个位置最适合建设新火车站。

代码结构

  1. 类定义

    • public class Main:定义了一个公共类 Main
  2. 方法定义

    • public static int[] solution(int n, int m, int[][] citizens, int[][] locations):这是主要的解决方案方法,用于计算最优火车站位置。
    • public static boolean arrayEqual(int[] a, int[] b):用于比较两个数组是否相等。
    • public static void main(String[] args):主方法,用于测试 solution 方法。

666.png

  • 参数

    • n:市民的总人数。
    • m:可建设火车站的备选位置数。
    • citizens:一个二维数组,表示市民的位置。
    • locations:一个二维数组,表示火车站的备选位置。
  • 逻辑

    • 初始化 minTotalDistance 为 Integer.MAX_VALUE,确保任何有效的总距离都会比它小。

    • 初始化 bestLocation 为一个无效的位置 {-1, -1}

    • 遍历每个火车站,计算所有市民到该火车站的总距离。

    • 如果当前火车站的总距离小于 minTotalDistance,则更新 minTotalDistance 和 bestLocation

    • 返回 bestLocation

      • 参数
    • a:第一个数组。

    • b:第二个数组。

  • 逻辑

    • 首先检查两个数组的长度是否相等,如果不相等则返回 false

    • 遍历数组,逐个比较元素,如果发现不相等的元素则返回 false

    • 如果所有元素都相等,则返回 true

      1. 二维数组的使用
    • 二维数组在表示多个位置(如市民和火车站的位置)时非常有用。

    • 通过 citizens[j][0] 和 citizens[j][1] 可以访问每个市民的坐标。

  1. 曼哈顿距离的计算

    • 曼哈顿距离的计算公式为 |x1 - x2| + |y1 - y2|,在代码中通过 Math.abs 函数实现。
  2. 双重循环

    • 使用双重循环遍历所有市民和火车站,计算每个市民到每个火车站的距离。
  3. 最小值的更新

    • 通过比较当前总距离和最小总距离,更新最小总距离和最佳位置。
  4. 数组比较

    • 使用 arrayEqual 方法比较两个数组是否相等,这在测试中非常有用。
  5. 测试用例

    • 在 main 方法中添加测试用例,确保代码的正确性。