class Solution:
    # n 矩阵行 m 矩阵列
    # i j 当前位置
    # word 单词 k 判断当前单词的位置
    # flag_matrix 判断是否已经访问
    def dfs(self, matrix, n, m, i, j, word, k, flag_matrix ):
        if i<0 or i>=n or j<0 or j>=m or(matrix[i][j] != word[k]) or flag_matrix[i][j]:
            return False
        # 是否结束
        if k == len(word) - 1:
            return True
        
        # 匹配 设置为False
        flag_matrix[i][j] = True
        
        # 开始扩散
        if self.dfs(matrix, n,m,i-1,j,word,k+1,flag_matrix) \
            or self.dfs(matrix, n,m,i+1,j,word,k+1,flag_matrix) \
            or self.dfs(matrix, n,m,i,j-1,word,k+1,flag_matrix) \
            or self.dfs(matrix, n,m,i,j+1,word,k+1,flag_matrix):
            return True
        # 前面匹配 但是后面不匹配 需要设置为False
        flag_matrix[i][j] = False
        return False

    def hasPath(self , matrix: List[List[str]], word: str) -> bool:
        if not matrix:
            return False
        n = len(matrix)
        m = len(matrix[0])
        flag_matrix = [[False for i in range(m)] for j in range(n)]
        for i in range(n):
            for j in range(m):
                if self.dfs(matrix, n, m, i, j,word, 0,flag_matrix):
                    return True
        return False