题目
思路
这是一道可以用回溯法解决的典型问题。
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)]