您的位置:首页 > 其它

街区最短路径问题

2015-09-29 21:58 381 查看
街区最短路径问题
时间限制: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
class
Main {

public
static void
main(String[]
args) {
Scannerreader=
new
Scanner(System.in);
int
n = reader.nextInt();
while (n-- > 0) {
int
min = 65535;
int
m = reader.nextInt();
Point[]points=
new
Point[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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: