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

2021-08-25 19:23:32 字數 1328 閱讀 6669

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

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

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

用(x,y)來表示住戶坐在的街區。

例如(4,20),表示使用者在東西方向第4個街道,南北方向第20個街道。

現在要建乙個郵局,使得各個住戶到郵局的距離之和最少。

求現在這個郵局應該建在那個地方使得所有住戶距離之和最小;

輸入

第一行乙個整數n<20,表示有n組測試資料,下面是n組資料;

每組第一行乙個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數

0y<

100 0

y<

100,表示某個使用者所在街區的座標。

m行後是新一組的資料;

輸出

每組資料輸出到郵局最小的距離和,回車結束;

樣例輸入23

1 1

2 1

1 25

2 9

5 20

11 9

1 1

1 20

樣例輸出

2 44

曼哈頓距離:兩點在南北方向上的距離加上在東西方向上的距離,即d(i,j)=|xi-xj|+|yi-yj|。對於乙個具有正南正北、正東正西方向規則布局的城鎮街道,從一點到達另一點的距離正是在南北方向上旅行的距離加上在東西方向上旅行的距離。

思路:因為只能東西和南北方向走,所以先把南北(x)和東西(y)方向的座標分開,分別求它們的最值,然後相加即可。分析可以得知,郵局的所建點必須在居民點上,要不然所得的值總會比最小值多出一部分來。知道這個然後讓我們來分析:假設在座標軸x上有n個點,是從1到n,我們所求的目標點在x上,先求點1和n到x的距離只和,很顯然x點在1到n之間,然後再求2和n-1到x的距離之和,很顯然x點在2和n-1之間,如此重複下去,x的範圍不斷減小,最後成為中位點。

#include

#include

#include

using

namespace

std;

int a[25],b[25];

int main()

sort(a,a+m);

sort(b,b+m);

int sum;

sum=0;

for(int i=0;i2;i++)

printf("%d\n",sum);

}return

0;}

街區最短路徑問題 曼哈頓距離

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 乙個街區有很多住戶,街區的街道只能為東西 南北兩種方向。住戶只可以沿著街道行走。各個街道之間的間隔相等。用 x,y 來表示住戶坐在的街區。例如 4,20 表示使用者在東西方向第4個街道,南北方向第20個街道。現在要建乙個郵局,使...

NYOJ 7 街區最短路徑問題 曼哈頓距離

曼哈頓距離 兩點在南北方向上的距離加上在東西方向上的距離,即d i,j xi xj yi yj 對於乙個具有正南正北 正東正西方向規則布局的城鎮街道,從一點到達另一點的距離正是在南北方向上旅行的距離加上在東西方向上旅行的距離。思路 因為只能東西和南北方向走,所以先把南北 x 和東西 y 方向的座標分...

NYOJ 7 街區最短路徑問題 曼哈頓距離

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 乙個街區有很多住戶,街區的街道只能為東西 南北兩種方向。住戶只可以沿著街道行走。各個街道之間的間隔相等。用 x,y 來表示住戶坐在的街區。例如 4,20 表示使用者在東西方向第4個街道,南北方向第20個街道。現在要建乙個郵局,使...