当前位置: 首页 > article >正文

【华为OD机试真题】战场索敌 · 区域统计问题 (Java/Go)

一、题目题目描述有一个大小是 N*M 的战场地图被墙壁 # 分隔成大小不同的区域。上下左右四个方向相邻的空地 . 属于同一个区域。只有空地上可能存在敌人 E。请求出地图上总共有多少区域里的敌人数小于 K。输入描述第一行输入为 N, M, KN 表示地图的行数M 表示地图的列数K 表示目标敌人数量。N, M 100之后为一个 N×M 大小的字符数组。输出描述敌人数小于 K 的区域数量。示例1输入3 5 2 ..#EE E.#E. ###..输出1说明地图被墙壁分为两个区域左边区域有1个敌人右边区域有3个敌人符合条件的区域数量是1二、核心解题思路连通块搜索本题本质是图论中的连通分量计数问题的变种。我们需要遍历整个地图每当发现一个未访问过的非墙壁格子.或E就启动一次搜索DFS 或 BFS将该连通块内的所有格子标记为“已访问”并统计其中E的数量。步骤 1全局遍历使用双重循环遍历地图的每一个格子(i, j)。如果当前格子是#或已访问过跳过。如果当前格子是.或E且未访问说明发现了一个新区域。步骤 2启动搜索 (DFS/BFS)从当前格子出发向上下左右四个方向扩展边界检查不越界。合法性检查不是墙壁#且 未访问过。统计逻辑如果遇到E计数器count。标记将访问过的格子标记为true防止重复计算。步骤 3判定与累加搜索结束后得到该区域的敌人总数enemyCount。若enemyCount K结果ans。继续遍历地图寻找下一个未访问的区域。Java vs Go实现策略差异⚔️Java利用其面向对象特性代码结构清晰。DFS 递归写法非常简洁对于 100×100100×100 的地图递归深度最大 10000通常在 JVM 默认栈大小范围内代码可读性最高。Go强调性能与显式控制。虽然 Go 也支持递归但在处理网格问题时使用BFS 切片模拟队列是更“Go 风格”的做法完全避免栈溢出风险且内存分配更可控。三、Java 语言实现 (DFS 递归版)Java 的递归写法如同“探路者”代码逻辑与人类直觉高度一致极其优雅。import java.util.Scanner; public class BattlefieldRegions { // 方向数组上、下、左、右 private static final int[] dx {-1, 1, 0, 0}; private static final int[] dy {0, 0, -1, 1}; public static void main(String[] args) { Scanner scanner new Scanner(System.in); if (!scanner.hasNextInt()) return; int N scanner.nextInt(); int M scanner.nextInt(); int K scanner.nextInt(); char[][] grid new char[N][M]; for (int i 0; i N; i) { String line scanner.next(); grid[i] line.toCharArray(); } boolean[][] visited new boolean[N][M]; int validRegions 0; // 遍历每个格子 for (int i 0; i N; i) { for (int j 0; j M; j) { // 如果是墙壁或已访问跳过 if (grid[i][j] # || visited[i][j]) { continue; } // 发现新区域启动DFS统计敌人 int enemyCount dfs(grid, visited, i, j, N, M); // 判断是否符合条件 if (enemyCount K) { validRegions; } } } System.out.println(validRegions); scanner.close(); } /** * DFS 深度优先搜索 * 返回当前连通块内的敌人数量 */ private static int dfs(char[][] grid, boolean[][] visited, int x, int y, int N, int M) { // 标记当前点已访问 visited[x][y] true; int count 0; // 如果当前点是敌人计数1 if (grid[x][y] E) { count; } // 向四个方向探索 for (int i 0; i 4; i) { int nx x dx[i]; int ny y dy[i]; // 边界检查 合法性检查 if (nx 0 nx N ny 0 ny M grid[nx][ny] ! # !visited[nx][ny]) { count dfs(grid, visited, nx, ny, N, M); } } return count; } }Java 代码亮点递归简洁dfs函数仅 20 行左右逻辑自包含无需手动维护栈结构。方向数组使用dx/dy数组简化四个方向的遍历代码避免写四遍if。状态隔离visited数组独立于grid保持原始数据不变符合函数式编程思想。四、Go 语言实现 (BFS 迭代版)Go 语言在处理此类问题时推荐使用BFS广度优先搜索配合slice模拟队列。这种方式不仅避免了深层递归可能导致的stack overflow虽然在本题规模下不太可能但这是良好的工程习惯而且执行效率极高。package main import ( bufio fmt os strings ) // 坐标结构体 type Point struct { x, y int } func main() { // 使用 bufio 提高读取效率 scanner : bufio.NewScanner(os.Stdin) if !scanner.Scan() { return } var N, M, K int fmt.Sscanf(scanner.Text(), %d %d %d, N, M, K) grid : make([][]rune, N) for i : 0; i N; i { if !scanner.Scan() { break } grid[i] []rune(scanner.Text()) } visited : make([][]bool, N) for i : range visited { visited[i] make([]bool, M) } validRegions : 0 // 方向数组 dx : []int{-1, 1, 0, 0} dy : []int{0, 0, -1, 1} // 遍历地图 for i : 0; i N; i { for j : 0; j M; j { // 跳过墙壁或已访问点 if grid[i][j] # || visited[i][j] { continue } // 发现新区域启动 BFS enemyCount : bfs(grid, visited, i, j, N, M, dx, dy) if enemyCount K { validRegions } } } fmt.Println(validRegions) } // BFS 广度优先搜索 func bfs(grid [][]rune, visited [][]bool, startX, startY, N, M int, dx, dy []int) int { count : 0 queue : []Point{{startX, startY}} visited[startX][startY] true // 如果起点是敌人先计数 if grid[startX][startY] E { count } head : 0 for head len(queue) { curr : queue[head] head // 探索四个方向 for k : 0; k 4; k { nx : curr.x dx[k] ny : curr.y dy[k] // 边界与合法性检查 if nx 0 nx N ny 0 ny M grid[nx][ny] ! # !visited[nx][ny] { visited[nx][ny] true if grid[nx][ny] E { count } // 入队 queue append(queue, Point{nx, ny}) } } } return count }Go 代码亮点结构体建模定义Point结构体存储坐标类型安全代码语义清晰。Slice 模拟队列利用 Go 切片动态扩容的特性append入队索引head出队无需引入container/list性能更佳。Rune 处理使用[]rune处理字符数组完美支持 Unicode虽然本题只有 ASCII但这体现了 Go 的严谨性。IO 优化使用bufio.Scanner替代fmt.Scan在处理多行输入时更稳定高效。五、逻辑推演与避坑指南示例1 深度推演输入3 5 2 ..#EE E.#E. ###..地图可视化(0,0). (0,1). | # (0,3)E (0,4)E (1,0)E (1,1). | # (1,3)E (1,4). ############### (全是墙) - 实际上是 ###.. 修正第三行###..区域划分左侧区域包含点(0,0), (0,1), (1,0), (1,1)敌人位置(1,0)是E。敌人总数1。判定12 (K)符合条件。右侧区域包含点(0,3), (0,4), (1,3), (1,4)敌人位置(0,3), (0,4), (1,3)是E。敌人总数3。判定3̸2 不符合。下方区域(第三行###..)看第二行对应列(1,3)是E,(1,4)是.。第三行(2,3),(2,4)是.。连通性检查(1,4)和(2,4)是上下相邻的修正推演右侧区域实际上包含了(2,3), (2,4)。点集(0,3)E, (0,4)E, (1,3)E, (1,4)., (2,3)., (2,4).。敌人总数依然是3。判定3̸2 。最终结果只有左侧区域符合输出1。⚠️ 常见陷阱输入读取Java 中scanner.next()会自动跳过空格和换行非常适合读取每一行的字符串。Go 中要注意scanner.Text()获取整行不要混用Scan和Text导致指针错位。边界条件地图边缘第 0 行、第 N-1 行等容易越界务必在 DFS/BFS 内部第一行做nx 0 nx N检查。重复访问必须在入队/递归前就标记visited true。如果在出队/回溯时才标记会导致同一个点被多次加入队列/栈造成死循环或超时。K 的值题目是“小于 K” ()不是“小于等于”。如果某区域敌人数正好是 K不应计入。六、复杂度分析时间复杂度 O(N×M) 。每个格子最多被访问一次进入 DFS/BFS 一次。每个格子的四个邻居检查是常数操作。空间复杂度 O(N×M) 。visited数组占用 N×M 。DFS 递归栈或 BFS 队列在最坏情况下整个地图是一个区域也可能达到 N×M 。七、结语“战场区域统计”是考察图论基础与代码实现细节的经典题目。Java 开发者可以学习如何用递归将复杂逻辑简化为优雅的几行代码。Go 开发者可以掌握如何用切片和结构体构建高效的迭代算法体现 Go 的性能优势。无论选择哪种语言“标记已访问”和“方向数组”都是解决此类网格问题的通用钥匙。掌握这套模板无论是 OD 机试还是 LeetCode 刷题都能游刃有余觉得有用请点赞、收藏⭐、关注后续将持续更新华为 OD 高频真题的多语言题解

相关文章:

【华为OD机试真题】战场索敌 · 区域统计问题 (Java/Go)

一、题目题目描述:有一个大小是 N*M 的战场地图,被墙壁 # 分隔成大小不同的区域。上下左右四个方向相邻的空地 . 属于同一个区域。只有空地上可能存在敌人 E。请求出地图上总共有多少区域里的敌人数小于 K。输入描述:第一行输入为 N, M, K&am…...

Python农业图像识别精度为何卡在92.3%?揭秘3个被90%开发者忽略的标注陷阱与突破路径

第一章:Python农业图像识别精度为何卡在92.3%?在多个田间部署的玉米病害识别模型中,验证集准确率稳定收敛于92.3%,进一步调参或增加训练轮次均未突破该阈值。深入分析发现,该瓶颈并非源于模型容量不足,而是…...

FFmpeg 全链路中间件深度分析

一、开源代码目录文件树形分析1.1 FFmpeg 源码整体架构树FFmpeg ├── configure # 配置脚本(生成config.h/config.mak) ├── Makefile # 顶层Makefile ├── Changelog # 版本变更…...

nli-distilroberta-base保姆级教学:从镜像拉取→端口映射→API测试全流程

nli-distilroberta-base保姆级教学:从镜像拉取→端口映射→API测试全流程 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的逻辑关系。这个轻量级模型能够快速准确地分析句子对&…...

想为小说配图?试试圣女司幼幽-造相Z-Turbo,我的真实使用体验

想为小说配图?试试圣女司幼幽-造相Z-Turbo,我的真实使用体验 1. 为什么我需要这个AI绘画工具 作为一名网络小说作者,我经常遇到一个难题:如何在社交媒体上为我的小说章节配上吸引人的插图。找画师定制价格昂贵,自己学…...

快速部署Super Qwen Voice World:复古像素风语音合成中心体验

快速部署Super Qwen Voice World:复古像素风语音合成中心体验 1. 项目简介与核心价值 Super Qwen Voice World是一个基于Qwen3-TTS技术构建的语音合成平台,它将传统的语音合成过程转化为一场充满趣味的8-bit游戏冒险。这个项目最吸引人的特点是&#x…...

论文降AI率完整操作教程:检测→定位→降AI→复查全流程详解

论文降AI率完整操作教程:检测→定位→降AI→复查全流程详解 很多同学一听"降AI率"就觉得很复杂。网上教程要么讲得太笼统(“用工具处理一下就好了”),要么一上来就推荐工具却不讲完整流程。 这篇教程不一样。我把降AI率…...

Janus-Pro-7B 软件设计模式解析:结合实例讲解23种经典模式

Janus-Pro-7B 软件设计模式解析:结合实例讲解23种经典模式 1. 为什么设计模式值得你花时间 每次看到别人写的代码清晰又灵活,自己写的却像一团乱麻,是不是有点头疼?或者接手一个老项目,光是理清各个模块怎么调用的就…...

阴阳师自动化脚本百鬼夜行智能控制指南:从配置到精通

阴阳师自动化脚本百鬼夜行智能控制指南:从配置到精通 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师自动化脚本是一款强大的游戏辅助工具,专为提升…...

PyTorch 2.8镜像实战案例:自媒体创作者批量生成短视频封面图工作流

PyTorch 2.8镜像实战案例:自媒体创作者批量生成短视频封面图工作流 1. 场景痛点与解决方案 短视频创作者每天面临的最大挑战之一,就是需要为每个视频制作吸引眼球的封面图。传统方式要么依赖设计师(成本高、周期长),…...

RWKV7-1.5B-g1a部署教程:supervisorctl status查看服务状态命令详解

RWKV7-1.5B-g1a部署教程:supervisorctl status查看服务状态命令详解 1. 模型简介 rwkv7-1.5B-g1a 是基于新一代 RWKV-7 架构的多语言文本生成模型,特别适合中文场景下的轻量级应用。这个1.5B参数的版本在保持较高生成质量的同时,对硬件要求…...

Realistic Vision V5.1 为SolidWorks模型渲染宣传图:工业设计可视化新流程

Realistic Vision V5.1 为SolidWorks模型渲染宣传图:工业设计可视化新流程 你是不是也遇到过这种情况?在SolidWorks里精心设计了一个产品模型,到了要出宣传图、给客户展示或者做方案汇报的时候,就头疼了。要么得花大半天甚至几天…...

提示词工程完全指南

提示词工程完全指南 Prompt Engineering Complete Guide 来源参考:OpenAI 官方指南、DAIR.AI Prompt Engineering Guide、IBM、Google Research、斯坦福 CS224N 整理用于学习交流 目录 什么是提示词工程六大核心策略(OpenAI 官方)基础技巧进…...

如何免费获取Microsoft Word APA第7版参考文献格式:完整安装指南

如何免费获取Microsoft Word APA第7版参考文献格式:完整安装指南 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为学术论文的参考文献…...

MacBook上的Safari安装油猴插件

MacBook Safari 浏览器安装油猴插件(Tampermonkey)完整教程 目录 一、什么是油猴插件二、准备工作三、安装 Tampermonkey 插件四、启用插件五、安装油猴脚本六、脚本管理七、进阶设置八、常见问题解决九、热门脚本推荐十、安全注意事项 一、什么是油猴…...

开发者专属配置:OpenClaw+GLM-4-7-Flash优化命令行工作效率

开发者专属配置:OpenClawGLM-4-7-Flash优化命令行工作效率 1. 为什么开发者需要AI增强命令行? 作为每天与终端打交道的开发者,我经常遇到这样的困境:忘记复杂的grep参数组合、需要反复查阅历史命令、或是面对一长串docker compo…...

TargetMol明星分子—— Eragidomide Mezigdomide

Eragidomide ,别名 CC-90009、 Cereblon modulator 1,是一种 GSPT1 选择性 cereblon (CRBN) E3 泛素连接酶调节剂,以分子胶的方式作用。它通过 CRL4CRBN 选择性靶向 GSPT1 进行泛素化和蛋白酶体降解。 Mezigdomide 货号 T10703,别…...

OpenClaw对接ollama模型:GLM-4.7-Flash接口配置详解

OpenClaw对接ollama模型:GLM-4.7-Flash接口配置详解 1. 为什么选择本地ollama部署GLM-4.7-Flash 去年我在尝试构建个人自动化工作流时,发现公有云API调用不仅费用高昂,还存在隐私顾虑。直到发现ollama这个轻量级模型运行框架,配…...

动态生成展示:LiuJuan20260223Zimage模型根据实时天气创作“风晴雨雪”主题画

动态生成展示:LiuJuan20260223Zimage模型根据实时天气创作“风晴雨雪”主题画 你有没有想过,家里的数字画框或者手机壁纸,能像有生命一样,随着窗外的天气实时变化?今天,我就带你体验一个特别有意思的玩法&…...

PyTorch 2.8镜像效果展示:RTX 4090D运行Kandinsky-3生成多风格插画作品集

PyTorch 2.8镜像效果展示:RTX 4090D运行Kandinsky-3生成多风格插画作品集 1. 开篇:高性能深度学习环境 当谈到AI绘画创作时,硬件性能往往决定了创作体验的上限。今天我们要展示的是在RTX 4090D 24GB显卡上运行的PyTorch 2.8深度学习环境&am…...

Zrlog面试问答及问题解决方案

面试问答 结合 ZrLog 部署(Maven 构建 环境配置 服务部署)的全流程,整理排查 / 运维 / 开发三类高频问题,覆盖场景、原因、解答思路,可直接用于沟通或故障定位: 一、环境准备阶段高频问题 1. 执行 jav…...

mPLUG在金融领域的应用:票据智能识别系统

mPLUG在金融领域的应用:票据智能识别系统 1. 项目背景与需求 金融行业每天都要处理海量的票据单据,从银行的支票、汇票,到保险公司的保单、理赔单,再到企业的发票、报销单。传统的人工处理方式不仅效率低下,还容易出…...

Cogito-3B量化部署实测:GTX1650/RTX3050/RTX4060不同显卡配置对比

Cogito-3B量化部署实测:GTX1650/RTX3050/RTX4060不同显卡配置对比 1. 测试背景与目标 Cogito-v1-preview-llama-3B作为一款性能出色的3B参数混合推理模型,在实际部署中面临显存占用的挑战。本次测试旨在评估该模型在不同消费级显卡上的量化部署表现&am…...

绝区零一条龙自动化工具:从机械操作到智能游戏的进化指南

绝区零一条龙自动化工具:从机械操作到智能游戏的进化指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 当你第…...

OpenClaw浏览器自动化:Qwen3-VL:30B爬取图文数据到Notion

OpenClaw浏览器自动化:Qwen3-VL:30B爬取图文数据到Notion 1. 为什么需要自动化数据收集 上周我需要整理一批行业报告中的关键图表和结论,手动复制粘贴了3个小时后,突然意识到:这种重复性工作正是AI该解决的问题。于是我开始尝试…...

SAM3问题解决:分割不准?试试调整检测阈值和提示词

SAM3问题解决:分割不准?试试调整检测阈值和提示词 1. 问题现象与原因分析 1.1 常见分割问题表现 在使用SAM3进行图像分割时,用户可能会遇到以下几种典型问题: 过度分割:一个物体被分割成多个不连续的部分欠分割&am…...

P1122 最大子树和

题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题。一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题。于是当日课后,小明就向老…...

交互式社会工程学攻击的演进与防御:基于2025年语音钓鱼激增现象的深度分析

摘要 随着人工智能生成内容(AIGC)技术的成熟与普及,网络攻击的初始访问向量正经历从自动化、非交互式向高度个性化、实时交互式的范式转变。本文基于Google Cloud Mandiant发布的《M-Trends 2026》报告数据,深入剖析了2025年语音钓…...

Anthropic Economic Index: AI对软件开发的影响 — 深度解读

原文: AI’s impact on software development 发布机构: Anthropic 解读日期: 2026年3月25日 一、研究背景与方法论 1.1 研究动机 软件开发工作虽然在现代经济中占比较小,但影响力巨大。过去两年,能够辅助甚至自动化大量编程工作的AI系统的引入&#x…...

Stable Diffusion像素艺术工作站实战:Pixel Fashion Atelier Forge Scale调优指南

Stable Diffusion像素艺术工作站实战:Pixel Fashion Atelier Forge Scale调优指南 1. 像素时装锻造坊简介 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站,专为像素艺术创作而设计。与传统AI工具不同,它采…...