一、题目
题目描述:
找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。
假设给定单词 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
四、要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
64bit IO Format:%lld
五、解题思路
- 首先,我们需要遍历矩阵中的每个位置,找到与给定单词的首字母匹配的位置。
- 对于每个匹配的位置,我们可以使用深度优先搜索(DFS)来判断是否能够连成给定的单词。
- 在DFS过程中,我们需要判断当前位置是否越界,是否已经访问过,以及当前位置的字母是否与给定单词的下一个字母匹配。
- 如果能够连成给定的单词,我们输出首字母在矩阵中的位置;否则,输出"NO"。
六、参考代码
# -*- coding: utf-8 -*-
'''
@File : 2023-B-单词搜索-找到它.py
@Time : 2023/12/15 17:13:34
@Author : mgc
@Version : 1.0
@Desc : None
'''
def find_word_position(n, m, word, matrix):
directions = [(0, 1), (0, -1), (1, 0), (-1, 0)] # 上下左右四个方向的偏移量
def dfs(row, col, index):
if index == len(word): # 已经匹配到给定单词的最后一个字母
return True
if row < 0 or row >= n or col < 0 or col >= m: # 当前位置越界
return False
if matrix[row][col] != word[index]: # 当前位置的字母与给定单词的下一个字母不匹配
return False
temp = matrix[row][col] # 临时保存当前位置的字母
matrix[row][col] = '#' # 将当前位置标记为已访问
for dx, dy in directions:
if dfs(row + dx, col + dy, index + 1): # 沿着四个方向继续搜索
return True
matrix[row][col] = temp # 恢复当前位置的字母
return False
for i in range(n):
for j in range(m):
if matrix[i][j] == word[0]: # 找到与给定单词首字母匹配的位置
if dfs(i, j, 0): # 使用DFS判断是否能够连成给定的单词
return f"{i+1} {j+1}" # 输出首字母在矩阵中的位置
return "NO"
# 测试样例
n, m = map(int, input().split())
word = input()
matrix = []
for _ in range(n):
row = list(input())
matrix.append(row)
result = find_word_position(n, m, word, matrix)
print(result)