backtracking + dfs + graph + recursive
class Solution:
    def exist(self, board, word):
        rows, cols = len(board), len(board[0])
        def dfs(r, c, i):
            if i == len(word):
                return True
            if (r < 0 or c < 0 or r >= rows or c >= cols or board[r][c] != word[i]):
                return False
            temp = board[r][c]
            board[r][c] = "#"
            found = (dfs(r+1, c, i+1) or
                    dfs(r-1, c, i+1) or
                    dfs(r, c+1, i+1) or
                    dfs(r, c-1, i+1))
            board[r][c] = temp
            return found
        for r in range(rows):
            for c in range(cols):
                if dfs(r, c, 0):
                    return True
        return False
def main():
    s = Solution()
    grid = [
        ['s', 'e', 'j'],
        ['u', 's', 'e'],
        ['s', 'u', 's']
    ]
    word = "jesus"
    result = s.exist(grid, word)
    expected = True
    assert result == expected, "erro"
main()