通过率 55% · 提交 302 · 通过 167
小慕有一个64 × 64的网格,每个格子初始值为0,现在他要向网格中填入一些数字,相同的数字会连成一个。下图展示了网格的一部分(空白格子表示值为0):

数字1构成了蓝色边框的,数字2构成了红色边框的实心图形。 每个格子的边长规定为1个单位。 小慕需要根据输入,计算每个非0数字所构成的实心图形的。
这类题属于华为 OD 机考真题方向中「200分 / 2023B」方向的高频题型,通常考察对「200分 / 2023B」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入N,表示N个图形,N > 0且 N < 64 × 64
矩阵左上角单元格坐标记作(0, 0),第一个数字表示行号,第二个数字表示列号
接下来是N行,每行第一个数是矩阵单元格填充的数字,后续每两个一组,表示填充该数字的单元格坐标
答题者无需考虑数据格式非法的场景,题目用例不考察数据格式
题目用例保证同一个填充值只会有一行输入数据
一共输出N个数值,每个数值表示某一行输入表示图形的周长
输出顺序需和输入的隔行顺序保持一致,即第1个数是输入的第1个图形的周长,第2个数是输入的第2个图形的周长,以此类推。
示例 1
输入示例
2 1 1 3 2 2 2 3 2 4 3 2 3 3 3 4 4 1 4 2 4 3 4 4 5 2 5 3 2 3 7 3 8 4 5 4 6 4 7 4 8 5 4 5 5 5 6 5 7 5 8 6 4 6 5 6 6 6 7 6 8 7 4 7 5 7 6 7 7 7 8
输出示例
18 20
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
本题属于 岛屿的周长 的 加强版,从计算 1 种连通区域 变成了计算 多种连通区域。
特别注意:题目并没有说同一种元素只会存在 一块连通块,不能够根据示例 先入为主。
思路展开 参考代码没有做 DFS/BFS 搜索,而是用「逐格数暴露边」的方式直接统计周长。第一步按输入落子:网格固定为 64 × 64、初始全 0,每行输入的第一个数是该图形的填充值 val,后面的数字两两一组是坐标 (x, y),把 grid[x][y] 置为 val;同时用列表 nums 按输入顺序记录出现过的值,保证最后按输入顺序输出结果。第二步遍历整个 64 × 64 网格:对每个格子取它的值 val,检查上、下、左、右四个方向——如果邻格出界,或者邻格的值与 val 不同,这条边就暴露在图形外沿,给哈希表 ansMap 中 val 对应的周长加 1;两个同值格子相邻的公共边则两边都不计,相当于内部边被抵消。这样每条外沿边恰好被它所属的格子统计一次,某个值的累计结果就是该数字所有格子构成图形的周长。这种按值累计的写法也天然覆盖了前文提醒的坑:同一个数字即使散成多个不相连的图形,各块的周长也会自动累加到同一个数字名下。最后按 nums 的顺序从 ansMap 取值、用空格拼接输出。
复杂度分析 网格大小固定为 64 × 64。设 n 为输入行数(图形个数),T 为输入的坐标对总数。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有