问题描述
小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| + |y1 - y2|,即曼哈顿距离。
在初步考察后,市政府列出了M个可能的火车站建设点。为了使得市民到火车站的总旅行时间最短,小F希望选出一个最优位置作为火车站的地址。
请你帮助小F计算出哪一个位置最适合建设新火车站。
代码结构
-
类定义:
public class Main:定义了一个公共类Main。
-
方法定义:
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方法。
-
参数:
n:市民的总人数。m:可建设火车站的备选位置数。citizens:一个二维数组,表示市民的位置。locations:一个二维数组,表示火车站的备选位置。
-
逻辑:
-
初始化
minTotalDistance为Integer.MAX_VALUE,确保任何有效的总距离都会比它小。 -
初始化
bestLocation为一个无效的位置{-1, -1}。 -
遍历每个火车站,计算所有市民到该火车站的总距离。
-
如果当前火车站的总距离小于
minTotalDistance,则更新minTotalDistance和bestLocation。 -
返回
bestLocation。 -
- 参数:
-
a:第一个数组。 -
b:第二个数组。
-
-
逻辑:
-
首先检查两个数组的长度是否相等,如果不相等则返回
false。 -
遍历数组,逐个比较元素,如果发现不相等的元素则返回
false。 -
如果所有元素都相等,则返回
true。 -
- 二维数组的使用:
-
二维数组在表示多个位置(如市民和火车站的位置)时非常有用。
-
通过
citizens[j][0]和citizens[j][1]可以访问每个市民的坐标。
-
-
曼哈顿距离的计算:
- 曼哈顿距离的计算公式为
|x1 - x2| + |y1 - y2|,在代码中通过Math.abs函数实现。
- 曼哈顿距离的计算公式为
-
双重循环:
- 使用双重循环遍历所有市民和火车站,计算每个市民到每个火车站的距离。
-
最小值的更新:
- 通过比较当前总距离和最小总距离,更新最小总距离和最佳位置。
-
数组比较:
- 使用
arrayEqual方法比较两个数组是否相等,这在测试中非常有用。
- 使用
-
测试用例:
- 在
main方法中添加测试用例,确保代码的正确性。
- 在