输出一直是false,重点在dfs函数,绕晕了
from typing import List
def exist(board: List[List[str]], word: str) -> bool:
# dfs寻找
m, n = len(board), len(board[0])
# 当前位置为(i, j),匹配到第k个字符
def dfs(i, j, k):
# 当数组越界或不相等时则不匹配
if not 0 <= i < m or not 0 <= j < n or not board[i][j] == word[k]:
return False
# 匹配成功
if k == len(word) - 1:
return True
# 避免走回头路
board[i][j] = ''
#下面是判断所要搜索的方向,8种情况
if k>0:
if board[i - 1][j] == word[k-1]:
res = dfs(i + 1, j, k + 1)
# 恢复当前的网格内字符
board[i][j] = word[k]
return res
elif board[i + 1][j] == word[k-1]:
res = dfs(i - 1, j, k + 1)
# 恢复当前的网格内字符
board[i][j] = word[k]
return res
elif board[i][j - 1] == word[k-1]:
res = dfs(i, j + 1, k + 1)
# 恢复当前的网格内字符
board[i][j] = word[k]
return res
elif board[i + 1][j + 1] == word[k-1]:
res = dfs(i - 1, j - 1, k + 1)
# 恢复当前的网格内字符
board[i][j] = word[k]
return res
elif board[i - 1][j - 1] == word[k-1]:
res = dfs(i + 1, j + 1, k + 1)
# 恢复当前的网格内字符
board[i][j] = word[k]
return res
elif board[i - 1][j + 1] == word[k-1]:
res = dfs(i + 1, j - 1, k + 1)
# 恢复当前的网格内字符
board[i][j] = word[k]
return res
elif board[i + 1][j - 1] == word[k-1]:
res = dfs(i - 1, j + 1, k + 1)
# 恢复当前的网格内字符
board[i][j] = word[k]
return res
else:
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(m):
for j in range(n):
if dfs(i, j, 0):
return True
return False
if name == "main":
n = int(input())
m = int(input())
line = [[0] * m] * n
for i in range(n):
line[i] = input().split(" ")
word = input()
print(exist(line, word))
你要横竖斜的去找,那要一直往一个方向找才行啊
你应该写4个二重循环,每个找不同的方向
而不是写一个循环,然后每一步都往各个方向去找
那也不是一条线啊,可以随便拐弯