JZ65 矩阵中的路径
book method
回溯算法
我们看到他是从矩形中的一个点开始往他的上下左右四个方向查找,这个点可以是矩形中的任何一个点,所以代码的大致轮廓我们应该能写出来,就是遍历矩形所有的点,然后从这个点开始往他的4个方向走,因为是二维数组,所以有两个for循环。每一个点我们都可以往他的4个方向查找,所以我们可以把它想象为一棵4叉树,就是每个节点有4个子节点,而树的遍历我们最容易想到的就是递归。
DFShttps://zhuanlan.zhihu.com/p/355968635
class Solution:
def dfs(self, m, i, j, word_idx):
if i<0 or i>=len(m) or j<0 or j>=len(m[0]) or self.visted[i][j] or m[i][j] != self.word[word_idx]:
# 边界值越界 / 已走过 / 值不同
return False
if word_idx == len(self.word) -1:
return True
self.visted[i][j] = 1
# 左下右上的顺序遍历
res = self.dfs(m, i, j-1, word_idx+1) or \
self.dfs(m, i+1, j, word_idx+1) or \
self.dfs(m, i, j+1, word_idx+1) or \
self.dfs(m, i-1, j, word_idx+1)
self.visted[i][j] = 0
return res
def hasPath(self , matrix , word ):
self.word = word
self.visted = [[0 for i in range(len(matrix[0]))] for i in range(len(matrix))]
word_idx = 0
for row in range(len(matrix)):
for col in range(len(matrix[0])):
if self.dfs(matrix, row, col, word_idx):
return True
return False