剑指offer实践 ——12.矩阵中的路径(python版)

题目

在这里插入图片描述

思路

这是一道可以用回溯法解决的典型问题。
1.在矩阵中随机选择一个格子,作为路径的起点。
2.初始化一个栈,该栈内保存已经找到的路径。
2.每一个格子周围都有4个格子可以选择,遍历这4个格子,如果有路径的下一个字符,则前进到这个格子,并更新栈;如果没有路径的下一个字符,则回溯到上一个格子,寻找其他可能。

题解

def hasPath(arr, rows, cols, path):
    if not arr or rows <= 0 or cols <= 0 or not path:
        return False
    boolmatrix = [([False] * cols) for i in range(rows)]
    path_len = 0

    for i in range(rows):
        for j in range(cols):
            if haspath_find(arr, rows, cols, i, j, boolmatrix, path_len, path):
                return True

    return False


def haspath_find(arr, rows,cols, row, col, boolmatrix, path_len, path):
    if path_len == len(path):
        return True
    hasNextpath=False
    # 合法row # 合法col 
    if row < 0 or row >= rows or col < 0 or col >= cols:
        return hasNextpath
    # 当前格子对应路径值  当前格子没有走过
    if arr[row][col] == path[path_len] and not boolmatrix[row][col]:
        boolmatrix[row][col] = True
        path_len += 1

        hasNextpath = (haspath_find(arr, rows, cols, row+1, col, boolmatrix, path_len, path)
            or haspath_find(arr, rows, cols, row-1, col, boolmatrix, path_len, path)
            or haspath_find(arr, rows, cols, row, col+1, boolmatrix, path_len, path)
            or haspath_find(arr, rows, cols, row, col-1, boolmatrix, path_len, path))

        if not hasNextpath:
            boolmatrix[row][col] = False
            path_len -= 1
    return hasNextpath


print(hasPath([['a', 'b', 'd'],
         ['c','c','c']], 2,3,'abc'))

注意⚠️:在使用二维数组赋值的时候,需要注意浅拷贝的问题。在初始化 boolmatrix时,如果使用

boolmatrix = [[False]*cols] * rows

则在赋值时

boolmatrix[0][0] = True

会导致所有行的第0列都变成True,因为在创建boolmatrix时,其它行都是复制的第一行的内存,因此想解决这个问题,需要如下初始化boolmatrix:

boolmatrix = [([False] * cols) for i in range(rows)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值