■ 题目描述

单词搜索

找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。

假设给定单词 HELLOWORD,在矩阵中只要能找到 H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。

注意区分英文字母大小写,并且您只能上下左右行走,不能走回头路。

输入描述

输入第 1 行包含两个整数 n、m (0 < n,m < 21) 分别表示 n 行 m 列的矩阵,

第 2 行是长度不超过100的单词 W (在整个矩阵中给定单词 W 只会出现一次),

从第 3 行 到第 n+2 行是指包含大小写英文字母的长度为 m 的字符串矩阵。

输出描述

如果能在矩阵中连成给定的单词,则输出给定单词首字母在矩阵中的位置(第几行 第几列),

否则输出“NO”。

示例1  

输入

5 5

HELLOWORLD

CPUCY

EKLQH

CHELL

LROWO

DGRBC

输出

3 2

 题解

class Solution:
    def exist(self, board, word, n, m):
        directions = [[0, 1], [0, -1], [1, 0], [-1, 0]]
        # 记录board内所存在的字符,与word的字符做对比,如果word的字符不存在board内,则直接返回false
        boardSet = set()
        for i in range(n):
            for j in range(m):
                boardSet.add(board[i][j])

        for i in word:
            if i not in boardSet:
                return False

        visited = set()
        ls = []
        # backtracking
        def dfs(i, j, ind):
            if i >= n or i < 0 or j >= m or j < 0:
                return False
            if (i, j) in visited:
                return False
            if board[i][j] != word[ind]:
                return False
            if ind == len(word) - 1:
                ls.append([i, j])
                return True
            visited.add((i, j))
            for x, y in directions:
                if dfs(i + x, j + y, ind + 1):
                    return True
            visited.remove((i, j))

            return False

        for i in range(n):
            for j in range(m):
                if dfs(i, j, 0):
                    return f'{i+1} {j+1}'

        return False




n, m = map(int, input().split())
ls = []
word = input()
for i in range(n):
    words = input()
    ls.append(words)
print(Solution().exist(ls, word, n, m))