难度指数:⭐⭐⭐⭐⭐
知识点:广度优先搜索
算法参考:
class Solution:
def exist(self, board: List[List[str]], word: str) -> bool:
def dfs(i, j, k):
if not 0 <= i < len(board) or not 0 <= j < len(board[0]) or board[i][j] != word[k]: return False
if k == len(word) - 1: return True
board[i][j] = ''
res = dfs(i + 1, j, k + 1) or dfs(i - 1, j, k + 1) or dfs(i, j + 1, k + 1) or dfs(i, j - 1, k + 1)
board[i][j] = word[k]
return res
for i in range(len(board)):
for j in range(len(board[0])):
if dfs(i, j, 0): return True
return False
作者:Krahets
链接:https://leetcode.cn/problems/word-search/solutions/2361646/79-dan-ci-sou-suo-hui-su-qing-xi-tu-jie-5yui2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Mine:
idea
回溯是精髓。从单词的第一个字母开始寻找,而对该字母的寻找依赖于其后一位字母的有效性,以此类推,即其后所有字母的有效性,直至最后一个字母。若找到了最后一个字母,就找到了该单词。
代码实现
m=int(input())
mat=[list(input().split(',')) for i in range(m)]
words=input()
n=len(mat[0])
ps=[-1 for i in range(2*len(words))]
def dfs(i,j,k):
try:
if mat[i][j]!=words[k]: return False
except:
return False
ps[2*k],ps[2*k+1]=i,j
if k==len(words)-1:
return True
res=dfs(i-1,j,k+1) or dfs(i+1,j,k+1) or dfs(i,j-1,k+1) or dfs(i,j+1,k+1)
return res
flag=1
for i in range(m):
for j in range(n):
if dfs(i,j,0):
print(','.join(map(lambda x:str(x),ps)))
flag=0
break
if flag:
print('N')