通过率 53% · 提交 775 · 通过 411
小慕正在开发一款战术模拟游戏。游戏中的战场是一张N行M列的地图,地图上的空地用'.'表示,墙壁用'#'表示。上下左右相邻的空地属于同一个,墙壁会将地图分割成若干个大小不同的区域。只有在空地上才可能出现敌人,敌人用'E'表示。现在小慕想知道,地图上一共有多少个区域中的敌人数量少于K。
这类题属于华为 OD 机考真题方向中「100分 / DFS」方向的高频题型,通常考察对「100分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入为N M K
N表示地图的行数,M表示地图的列数,K表示目标敌人数量
N, M <= 100
之后为一个N x M大小的字符数组
敌人数小于K的区域数量
示例 1
输入示例
3 5 2 ..#EE E.#E. ###..
输出示例
1
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
题意一句话:墙壁 # 把地图分割成若干个由非墙格子(空地 . 和敌人格 E)四连通组成的区域,统计敌人数量少于 K 的区域一共有多少个。
本题属于二维网格(岛屿类型)BFS/DFS 模板题,是经典题型《岛屿的最大面积》的变种:把「统计连通块面积」换成「统计连通块里字符 E 的数量」。
E区域由相邻的 . 和 E 共同组成(E 本质也是空地,只是上面站了敌人)。因此 BFS 的扩展条件是格子不是 `#`。同一区域里两个敌人即使隔着若干空地,也属于同一个区域——如果只沿 E 扩展,会把一个区域里被空地隔开的敌人错拆成多块,得到错误答案。
1. 读入行数 n、列数 m、阈值 k 和网格;建 n×m 的访问标记数组。 2. 双重循环扫描网格:遇到一个非 `#` 且未访问的格子,就从它启动一次 BFS——对应发现了一个新区域。 3. BFS 用队列扩展:出队一个坐标,若该格是 E,当前区域敌人数 curNum 加一;向上下左右四个方向尝试,邻格「不越界 + 非 # + 未访问」才入队,并在入队时立即标记已访问。 4. 一次 BFS 结束即走遍一个完整区域,若 curNum < k,答案 ans 加一。 5. 全图扫描结束,输出 ans。
curNum < k),别写成 <=。curNum = 0)同样满足 0 < k,也计入答案,参考代码即如此处理。登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有