通过率 50% · 提交 924 · 通过 462
小慕正在玩一个找单词的小游戏,他需要在一个中找到给定的单词。 假设给定单词是HELLOWORLD,只要在矩阵中能按顺序找到HELLOWORLD就算成功。 注意区分英文字母大小写,并且小慕只能上下左右移动,不能走重复的路径。
这类题属于华为 OD 机考真题方向中「200分 / DFS」方向的高频题型,通常考察对「200分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入第一行包含两个整数N M (0 < N, M < 21)
分别表示N行M列的矩阵
第二行是长度不超过100的单词W
在整个矩阵中给定单词W只会出现一次
从第3行到第N+2是只包含大小写英文字母的长度为M的字符串矩阵
如果能在矩阵中连成给定的单词,则输出给定单词首字母在矩阵中的位置为第几行第几列
否则输出 NO
示例 1
输入示例
5 5 HELLOWORLD CPUCY EKLQH CHELL LROWO DGRBC
输出示例
3 2
示例 2
输入示例
5 5 Helloworld CPUCh wolle orldO EKLQo PGRBC
输出示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意,本题和 经典题型. 单词搜索 几乎完全一致,唯一的区别在于前者只要求判断是否能够找到该单词,本题还需要输出起始位置。
我们需要思考的是,对于这种二维网格如何进行回溯?换句话说,如何构建回溯函数?
在回溯过程中我们需要知道以下信息:
对于第一点,我们的回溯函数中需要存在参数 word_idx,来表示待搜索的单词此时遍历到的索引位置。 对于第二点,我们的回溯函数需要传入当前搜索的点的位置 (x, y)。 对于第三点,这个在二维网格类型的搜索问题中是非常常用的技巧,即构建一个大小和 grid 一样的 check_list。 对于第四点,我们可以直接声明一个全局变量 isFind 来表示是否已经找到该单词。
除了这些参数之外,我们还需要传入二维矩阵 grid 本身,它的大小 N 和 M 等等。
容易构建出回溯函数如下:
容易发现,此处回溯函数的写法,和我们用 DFS 做二维网格搜索类型的题目是非常类似的。 换句话说,在当前点 (x, y) 的近邻点上下左右四个方向的选取的这个 for 循环,实际上就对应着回溯过程中状态树的横向遍历。 和常规 DFS 解法的区别在于,我们现在搜索的是一条路径,所以我们需要在递归调用 backtracking() 函数的前后,进行 check_list[nx][ny] 的状态更新和回滚,来表示近邻点 (nx, ny) 已经被使用过以及回滚之后再次可以被使用的情况。
在递归调用回溯函数的时候,我们需要将下一个点 (nx, ny) 以及 word 的下一个字符索引 word_idx+1 传入函数中。
回溯的终止条件也非常简单,就是当 word_idx 已经等于 len(word)-1 了,说明整个 word 的所有字符都能够在二维网格中找到,那么修改 isFind 为 True,同时退出搜索。
而递归入口则需要这样调用:
注意到,由于在回溯函数中修改 check_list 始终是对 (nx, ny) 进行修改,所以我们在做起始点搜索的双重循环的时候,在递归函数入口处,需要对起始点 (i, j) 额外地进行 check_list 的状态更新和回滚。
如果你想直接修改 check_list[x][y] 而不是修改 check_list[nx][ny],那么回溯函数也可以改成这样:
这样就跟常规的 DFS 解法更加接近,但和常规的回溯题目的相似性就没那么高了。 因为状态更新和回滚写在了横向遍历 for 循环的外部。
对应的,由于此处状态的是 (x, y) 而非 (nx, ny),那么在递归入口处就可以不用单独进行 (i, j) 的更新了。即递归入口可以写为:
复杂度分析
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
NO
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有