求最短通路值

题目:  

       给定一个整型矩阵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)
 

def minPathValue(m):
    if m == None or len(m) == 0 or len(m[0]) == 0 or m[0][0]!=1 or m[-1][-1]!=1:
        return 

    #map_表示从(0,0)到每个点的距离
    map_ = [[0 for i in range(len(m[0]))] for i in range(len(m))]

    rQ = []
    cQ = []
    rQ.append(0)
    cQ.append(0)
    map_[0][0] = 0

    while len(rQ)!=0:
        row = rQ.pop(0)
        col = cQ.pop(0)

        if row == len(m)-1 and col == len(m[0])-1:
            return map_[row][col]

        pre = map_[row][col]
        walkTo(m,map_,row-1,col,rQ,cQ,pre)
        walkTo(m,map_,row+1,col,rQ,cQ,pre)
        walkTo(m,map_,row,col-1,rQ,cQ,pre)
        walkTo(m,map_,row,col+1,rQ,cQ,pre)

    return 0

def walkTo(m,map_,row,col,rQ,cQ,pre):
    if row < 0 or row == len(m) or col < 0 or col == len(m[0]) or m[row][col]!=1 or map_[row][col]!=0:
        return

    map_[row][col] = pre + 1
    rQ.append(row)
    cQ.append(col)


m = [[1,0,1,1,1],[1,0,1,0,1],[1,1,1,0,1],[0,0,0,0,1]]
minPathValue(m)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值