剣指offer python版12.行列内のパス

10084 ワード

'''
       ,                             。
                 ,           ,  ,  ,        。
                  ,            。
   [[a b c e], [s f c s], [a d e e]]           "bcced"   ,        "abcb"  ,
           b                 ,           。
'''

class Solution:
    def hasPath(self, matrix, rows, cols, path):
        if matrix == None or rows < 1 or cols < 1 or path == None:
            return False
        visited = [0] * (rows * cols)

        pathLength = 0
        for row in range(rows):
            for col in range(cols):
                if self.hasPathCore(matrix, rows, cols, row, col, path, pathLength, visited):
                    return True
        return False

    def hasPathCore(self, matrix, rows, cols, row, col, path, pathLength, visited):
        if len(path) == pathLength:
            return True

        hasPath = False
        if row >= 0 and row < rows and col >= 0 and col < cols and matrix[row * cols + col] == path[pathLength] and not \
                visited[row * cols + col]:

            pathLength += 1
            visited[row * cols + col] = True

            hasPath = self.hasPathCore(matrix, rows, cols, row, col - 1, path, pathLength, visited) or\
            self.hasPathCore(matrix, rows, cols, row - 1, col, path, pathLength, visited) or\
            self.hasPathCore(matrix, rows, cols, row, col + 1, path, pathLength, visited) or\
            self.hasPathCore(matrix, rows, cols, row + 1, col, path, pathLength, visited)

            if not hasPath:
                pathLength -= 1
                visited[row * cols + col] = False

        return hasPath

if __name__ == '__main__':
    s = Solution()
    ifTrue = s.hasPath("ABCESFCSADEE", 3, 4, "ABCCED")
    ifTrue2 = s.hasPath("ABCEHJIGSFCSLOPQADEEMNOEADIDEJFMVCEIFGGS", 5, 8, "SGGFIECVAASABCEHJIGQEM")
    print(ifTrue)