6、标题:找到它
【找到它】找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。假设给定单词 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”。
示例:
输入
5 5
HELLOWORLD
CPUCY
EKLQH
CHELL
LROWO
DGRBC
输出
3 2
def find_it():
# 给数据一个固定的默认值方便调试
# n, m = 5, 5
# s = "HELLOWORLD"
# arr = ["CPUCY", "EKLQH", "CHELL", "LROWO", "DGRBC"]
n, m = tuple([int(x) for x in input().strip().split(" ")])
s = input().strip()
arr = []
for i in range(n):
arr.append(input().strip())
def loc_surroundings(loc):
"""按上、右、下、左顺序输出坐标周围的合法坐标"""
loc_up = (loc[0] - 1, loc[1])
loc_right = (loc[0], loc[1] + 1)
loc_below = (loc[0] + 1, loc[1])
loc_left = (loc[0], loc[1] - 1)
surroundings = []
for location in [loc_up, loc_right, loc_below, loc_left]:
if 0 <= location[0] <= n - 1 and 0 <= location[1] <= m - 1:
surroundings.append(location)
return surroundings
def search_path(start_loc, s_index, tmp_result, result):
"""回溯"""
if s_index > len(s) - 2:
result.append(tmp_result[:])
return
for surround_loc in loc_surroundings(start_loc):
# 不能走回头路
if surround_loc != start_loc and surround_loc not in tmp_result and \
arr[surround_loc[0]][surround_loc[1]] == s[s_index + 1]:
tmp_result.append(surround_loc)
search_path(surround_loc, s_index + 1, tmp_result, result)
tmp_result.pop()
tmp_result, result = [], []
# 找到起点符合的坐标,开始回溯
for i in range(m):
for j in range(n):
if arr[i][j] == s[0]:
tmp_result.append((i, j))
search_path((i, j), 0, tmp_result, result)
if result:
return i+1, j+1
print(find_it())