距離最短中轉站

2021-09-25 11:49:05 字數 2698 閱讀 2715

建物流中轉站

牛客網:物流中轉站

題目描述

shopee物流會有很多個中轉站。在選址的過程中,會選擇離使用者最近的地方建乙個物流中轉站。 假設給你乙個二維平面網格,每個格仔是房子則為1,或者是空地則為0。找到乙個空地修建乙個物流中轉站,使得這個物流中轉站到所有的房子的距離之和最小。 能修建,則返回最小的距離和。如果無法修建,則返回 -1。

1 若範圍限制在100*100以內的網格,如何計算出最小的距離和?

2 當平面網格非常大的情況下,如何避免不必要的計算?

輸入描述:

示例1:

40 1 1 0

1 1 0 1

0 0 1 0

0 0 0 0

先輸入方陣階數,然後逐行輸入房子和空地的資料,以空格分隔。

輸出

8示例2

輸入

41 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

輸出

-1思路:

距離最短的物流站一定是在建築群最中心的位置,那麼最中心是什麼意思?這裡我的方案是取每個建築橫縱座標的均值當做中心位置的座標。這裡要注意,此時的座標很可能是小數,但不影響,我們接下來只要找到距離這個座標最近的非建築點即可。因此我們需要遍歷整個矩陣,找出距離中心位置最近的非建築的座標,然後將此座標作為真正的中心位置,再次遍歷整個矩陣算距離即可(距離的定義:abs

(i−p

)+ab

s(j−

q)

)abs(i-p) + abs(j-q))

abs(i−

p)+a

bs(j

−q))

。取整的方案是向上取整還是向下取整。當時做題的時候很困惑,對於牛客給出的示例1,個人覺得中心點很像 (1,

2)

(1,2)

(1,2

) 這個座標,事實上我們算出來的其實是 (5/

6,9/

6)

(5/6,9/6)

(5/6,9

/6) ,也就是 (0,

1)

(0,1)

(0,1

) 這個座標點。也就是說我自己算出來的 (0,

1)

(0,1)

(0,1

) 這個座標點和我自己的直覺中心座標點 (1,

2)

(1,2)

(1,2

) 正好相差 (1,

1)

(1,1)

(1,1

) ,在不確定的情況下,我的方案是兩個都放入**中,取結果最小的即可。

事實上我們的直覺往往是有問題的,問題在於我們習慣了把矩陣的行,列索引從1開始計數,而在程式語言裡,索引往往是從0開始計數的。比如上述的示例1,總共有六個建築點,行索引和為5,列索引和為9。假設我們按照自己的直覺,看待矩陣時直接從1開始計數,那麼直覺中的行和為11,列和為15,取平均就是 (11/

6,15/

6)

(11/6,15/6)

(11/6,

15/6

) ,即 (1,

2)

(1,2)

(1,2

) 。恰好和我們的直覺吻合,但是這個中心點是基於索引從1開始計數得到的,因此在矩陣中的真實索引應該是(0,

1)

(0,1)

(0,1

),就是我們先前推導的。由於自己的慣性思維,繞了個大彎子,實感慚愧!

def cal_distance(num,k,l): #找出距離理論上的中心位置(k,l)最近的真正中心位置(p,q)並計算總的距離

res = 0

record = 2*n

for i in range(n):

for j in range(n):

if num[i][j]==0:

temp = abs(i-k) + abs(j-l)

if record > temp:

record = temp

p,q = i,j

for i in range(n):

for j in range(n):

if num[i][j] == 1:

res += abs(i-p) + abs(j-q)

return res

if __name__ == '__main__':

n = int(input())

num = #存放整個矩陣

for _ in range(n):

row, col, count = 0, 0, 0

for i in range(n):

for j in range(n):

if num[i][j]==1:

row += i

col += j

count += 1

if count == n**2:

print(-1)

else:

k = row/count

l = col/count #k,l分別是理論上的中心位置的橫縱座標,注意是小數

print(cal_distance(num,k,l))

物流中轉站

shopee物流會有很多個中轉站。在選址的過程中,會選擇離使用者最近的地方建乙個物流中轉站。假設給你乙個二維平面網格,每個格仔是房子則為1,或者是空地則為0。找到乙個空地修建乙個物流中轉站,使得這個物流中轉站到所有的房子的距離之和最小。能修建,則返回最小的距離和。如果無法修建,則返回 1。若範圍限制...

建物流中轉站

題目描述 shopee物流會有很多個中轉站。在選址的過程中,會選擇離使用者最近的地方建乙個物流中轉站。假設給你乙個二維平面網格,每個格仔是房子則為1,或者是空地則為0。找到乙個空地修建乙個物流中轉站,使得這個物流中轉站到所有的房子的距離之和最小。能修建,則返回最小的距離和。如果無法修建,則返回 1。...

牛客 OR175 物流中轉站 超詳細解答

題目描述 shopee物流會有很多個中轉站。在選址的過程中,會選擇離使用者最近的地方建乙個物流中轉站。假設給你乙個二維平面網格,每個格仔是房子則為1,或者是空地則為0。找到乙個空地修建乙個物流中轉站,使得這個物流中轉站到所有的房子的距離之和最小。能修建,則返回最小的距離和。如果無法修建,則返回 1。...