建物流中轉站
牛客網:物流中轉站
題目描述
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。...