■ 题目描述
【单词搜索】
找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。
假设给定单词 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))