1. 程式人生 > >陣列與矩陣---求最短通路值

陣列與矩陣---求最短通路值

【題目】

  給定一個整型矩陣matrix表示一個網路,1代表有路,0代表無路,每一個位置只要不越界,都有上下左右四個方向,求從最左上角到最右下角的最短通路值。
  例如,matrix為:
  1 0 1 1 1
  1 0 1 0 1
  1 1 1 0 1
  0 0 0 0 1
   通路只有一條,由12個1構成,所以返回12。

【基本思路】

  使用寬度優先遍歷即可。生成map矩陣,map[i][j]的含義是從位置(0, 0)走到位置(i, j)最短的路徑值。佇列rQ和cQ分別用於存放位置橫縱座標,初始時將位置(0, 0)壓入佇列。
  
  不斷的從佇列中彈出一個位置(r, c),然後看這個位置的上下左右哪個位置有路可走,即matrix中的值為1,將能走的位置的座標壓入佇列中,同時設定好在map中的值,即map[r][c] + 1。在這個過程中,需要考慮下一個位置是否之前已經走過,這個情況可以根據map中的值進行判斷,如果下一個位置的map值不為0,那麼說明之前已經走過,跳過即可。
  
  一直重複上述步驟,直到遇到終點座標,返回map中相應的值即可。如果rQ和cQ已經為空都沒有遍歷到終點位置,說明不存在這樣的一條路徑,返回0.
  
  如果矩陣大小為N*M,這個過程的時間複雜度為O(M*N)

下面是使用python3.5實現的程式碼。

def minPathValue(m):
    def walkTo(map, m, row, col, rQ, cQ, pre):
        if row < 0 or col < 0 or row == len(m) or col == len(m[0]) \
                or m[row][col] != 1 or map[row][col] != 0:
            return
        rQ.append(row)
        cQ.append(col)
        map[row][col] = pre + 1
if m == None or len(m) == 0 or len(m[0]) == 0 \ or m[0][0] != 1 or m[-1][-1] != 1: return 0 map = [[0 for i in range(len(m[0]))] for j in range(len(m))] map[0][0] = 1 rQ = [] cQ = [] rQ.append(0) cQ.append(0) while rQ: row = rQ.pop(0) col = cQ.pop(0
) if row == len(m)-1 and col == len(m[0])-1: return map[-1][-1] walkTo(map, m, row+1, col, rQ, cQ, map[row][col]) walkTo(map, m, row-1, col, rQ, cQ, map[row][col]) walkTo(map, m, row, col+1, rQ, cQ, map[row][col]) walkTo(map, m, row, col-1, rQ, cQ, map[row][col]) return 0