街区最短路径问题
时间限制:3000 ms | 内存限制:65535 KB
难度:4
描述
一个街区有很多住户,街区的街道只能为东西、南北两种方向。
住户只可以沿着街道行走。
各个街道之间的间隔相等。
用(x,y)来表示住户坐在的街区。
例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。
现在要建一个邮局,使得各个住户到邮局的距离之和最少。
求现在这个邮局应该建在那个地方使得所有住户距离之和最小;
输入
第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
m行后是新一组的数据;
输出
每组数据输出到邮局最小的距离和,回车结束;
样例输入
2
3
1 1
2 1
1 2
5
2 9
5 20
11 9
1 1
1 20
样例输出
2
44
import java.util.Scanner;
public classMain {
public static void main(String[] args) {
Scannerreader= newScanner(System.in);
int n = reader.nextInt();
while (n-- > 0) {
int min = 65535;
int m = reader.nextInt();
Point[]points= newPoint[m];
for (int i = 0; i < m; i++) {
Pointp = new Point(reader.nextInt(), reader.nextInt());
points[i] = p;
}
int minx = 100;
int miny = 100;
int maxx = 0;
int maxy = 0;
for (int k = 0; k < m; k++) {
if (points[k].x < minx) {
minx = points[k].x;
}
if (points[k].x > maxx) {
maxx = points[k].x;
}
if (points[k].y < miny) {
miny = points[k].y;
}
if (points[k].y > maxy) {
maxy = points[k].y;
}
}
for (int i = minx; i <= maxx; i++) {
for (int j = miny; j <= maxy; j++) {
int tempx = 0;
int tempy = 0;
for (int k = 0; k < m; k++) {
tempx += Math.abs(i - points[k].x);
tempy += Math.abs(j - points[k].y);
}
if (min > tempx + tempy) {
min = tempx + tempy;
}
}
}
System.out.println(min);
}
reader.close();
}
}
class Point {
int x;
int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}