【题目】
给定一个整型矩阵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