通过率 48% · 提交 937 · 通过 447
小慕正在开发一套加密系统。明文是一段由数字0-9组成的数字串,通过一个特殊的密码本查找转换,生成另一段密文数字串。规则如下: 1. 明文为一段数字串,由0-9组成。 2. 密码本为数字0-9组成的二维数组。 3. 需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里的数字串是由数字组成,上下和左右是相邻的,注意:对角线不相邻,。 4. 每一位明文对应密文即为密码本中找到的单元格所在的行和列序号(序号从0开始)组成的两个数字。如明文第i位Data[i]对应密码本单元格为Book[X][Y],则明文第i位对应的密文为X Y,X和Y之间用空格隔开。 如果有多条密文,返回。如果密码本无法匹配,返回"error"。 请你帮小慕设计这个加密程序。
这类题属于华为 OD 机考真题方向中「200分 / DFS」方向的高频题型,通常考察对「200分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入1个正整数N,代表明文的长度(1 <= N <= 9)
第二行输入N个明文数字组成的序列Data[i](整数,0 <= Data[i] <= 9)
第三行输入1个正整数M,(1 <= M <= 9)
接下来输入一个M*M的矩阵代表密码本Book[i][i],(整数,0 <= Book[i][i] <= 9)
如明文 第i位Data[i]对应密码本单元格为Book[i][j],则明文第i位对应的密文为X Y,X和Y之间用空格隔开。如果有多条密文,返回字符序最小的密文。如果密码本无法匹配,返回"error"。
示例 1
输入示例
4 0 0 2 4 4 0 0 2 4 1 3 4 6 3 4 1 5 6 6 6 5
输出示例
0 0 0 1 0 2 0 3
示例 2
输入示例
2 0 3 3 0 0 2 1 3 4 6 6 4
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
注意,本题和 经典题型. 单词搜索、【回溯】2023C-找到它 非常类似。唯一的区别是,题目不保证答案是唯一的,当存在多个合适的密文的时候,需要返回字典序最小的那个。
本题基本思路与【回溯】2023C-找到它一致,但需要着重考虑最小字典序的问题。
此时,搜索的方向数组 DIRECTIONS 里的顺序就非常重要。假设当前点为 (x, y),那么其近邻点为:
(x-1, y)(x, y-1)(x, y+1)(x+1, y)显然,如果存在多个近邻点同时满足下一个字符的时候,按照上、左、右、下这个顺序来搜索的话,一定能够得到最小的字典序,因为坐标为更小字典序的近邻点被优先搜索了。
这也是极少数的,我们需要特别注意方向数组 DIRECTIONS 的顺序的题目。即:
思路展开 参考代码在「单词搜索」的回溯骨架上加了两处保证字典序最小的关键设计。第一处是起点的枚举顺序:主函数按行优先双重循环枚举 (i, j),坐标小的起点先被尝试,所以第一个能匹配完整明文的起点必然是行列序号最小的。第二处是方向数组的顺序:DIRECTIONS 固定为上、左、右、下——对当前点 (x, y) 来说,四个近邻中 (x-1, y) 的坐标字典序最小、(x+1, y) 最大,按这个顺序深搜,每一步都优先延伸坐标更小的分支,于是搜索树里第一条被完整走通的路径就是字典序最小的密文。找到后立即在递归内部打印 path 并把 isFind 置真,之后所有尚未展开的递归调用在入口处直接返回,相当于一次全局剪枝。path 在状态更新时压入 (nx, ny)、回滚时弹出,起点坐标则作为初始路径在递归入口传入;全部起点试完仍未命中时输出 error。
复杂度分析
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
0 1 1 1
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有