python實現街區最短路徑問題

參考:https://blog.csdn.net/qq_25245961/article/details/77522141

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

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

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

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

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

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

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

輸入 
第一行一個整數n<20,表示有n組測試數據,下面是n組數據; 
每組第一行一個整數m<20,表示本組有m個住戶,下面的m行每行有兩個整數0 < x,y < 100,表示某個用戶所在街區的座標。 
m行後是新一組的數據;

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

這個題目的特點是要對蠻力法進行優化。 
算法思想: 
可以先對x軸進行遍歷,從1到100的每個橫座標點到輸入點(x,y)的橫座標的距離和的最小值記爲xmin; 
同理,然後對y軸進行遍歷,從1到100的每個縱座標點到輸入點(x,y)的縱座標的距離和的最小值記爲ymin; 
求sum = xmin + ymin即爲最小距離和。 
算法複雜度:O(m*n),循環次數最多爲100*20。

n = input('請輸入組數<20:')
n = int(n)
biglist = []
for _ in range(n):

    xmin = 2 ** 32
    ymin = 2 ** 32
    sums = 2 ** 32
    sublist = []
    m = input('請輸入座標組數<100:')
    m = int(m)
    for _ in range(m):
        sublist.append(list(map(int, input().strip().split()[:2])))
    print(sublist[0])       # [1, 2]

    i=1
    for i in range(101):
        if xmin>sums:
            xmin = sums
        sums = 0
        k = 0
        while k<m:
            sums += abs(i-sublist[k][0])
            k += 1
    print('x軸方向最小和:',xmin)

    sums = 2**32
    j = 1
    for j in range(101):
        if ymin > sums:
            ymin = sums
        sums = 0
        k = 0
        while k < m:
            sums += abs(j - sublist[k][1])
            k += 1

    print('y軸方向最小和:', ymin)
    print('最小距離和是:',xmin+ymin)

.
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章