1. 程式人生 > >NYOJ:街區最短路徑問題(曼哈頓距離)

NYOJ:街區最短路徑問題(曼哈頓距離)

描述

一個街區有很多住戶,街區的街道只能為東西、南北兩種方向。

住戶只可以沿著街道行走。

各個街道之間的間隔相等。

用(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

看過曼哈頓距離的人應該知道在兩個點之間的最短距離是確定的。

如果兩個點座標為x1,y1,x2,y2,那他們之間的最短距離為

abs(x1-x2)+abs(y1-y2)。

這樣就可以把所有的點先排個序,用最大的減最小的,次大的減次小的,直到最後。

#include<stdio.h>
#include<algorithm>
#define N 120
using namespace std;
int a[N],b[N];
int main()
{
	int n,m,i,ans;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&m);
		for(i=0;i<m;i++)
			scanf("%d%d",&a[i],&b[i]);
		sort(a,a+m);
		sort(b,b+m);
		ans=0;
		for(i=0;i<m/2;i++)
			ans+=(a[m-i-1]-a[i])+(b[m-i-1]-b[i]);
		printf("%d\n",ans);
	}
	return 0;
}