华为OD机试真题---战场索敌
华为OD机试真题“战场索敌”是一道考察算法和数据结构应用能力的题目。以下是对该题目的详细解析:
一、题目描述
有一个大小是N×M的战场地图,被墙壁’#‘分隔成大小不同的区域。上下左右四个方向相邻的空地’.‘属于同一个区域,只有空地上可能存在敌人’E’。请求出地图上总共有多少区域里的敌人数小于K。
二、输入描述
第一行输入为N,M,K;N表示地图的行数,M表示地图的列数,K表示目标敌人数量。N,M≤100。之后为一个N×M大小的字符数组。
三、输出描述
输出敌人数小于K的区域数量。
四、示例1
输入
3 5 2
..#EE
E.#E.
###..
1234
输出
1
说明
地图被墙壁分为两个区域,左边区域有1个敌人,右边区域有3个敌人,符合条件的区域数量是1
五、解题思路
-
理解题目:
- 首先,明确题目要求统计的是敌人数小于K的区域数量。
- 地图被墙壁’#‘分隔成不同的区域,每个区域内的空地’.‘是连通的,且只有空地上可能存在敌人’E’。
-
确定算法:
- 由于需要遍历地图并统计每个区域内的敌人数量,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来遍历每个区域。
- 在遍历过程中,使用一个计数器来统计每个区域内的敌人数量,并判断该数量是否小于K。
-
实现步骤:
- 初始化一个二维布尔数组
visited
,用于标记地图中的每个位置是否已经被访问过。 - 定义一个DFS函数,该函数接受当前位置(i, j)和计数器
count
作为参数。 - 在DFS函数中,首先检查当前位置是否越界、是否已被访问过或是否是墙壁’#’。如果不满足这些条件,则将其标记为已访问,并根据当前位置的值判断是否为敌人’E’(如果是,则
count
加1)。 - 然后,递归地调用DFS函数来访问当前位置的上下左右四个相邻位置。
- 在遍历完一个区域后,检查该区域内的敌人数量是否小于K,如果是,则结果加1。
- 最后,输出结果。
- 初始化一个二维布尔数组
六、代码示例(Python)
def battlefield_enemy_count(N, M, K, grid):"""计算战场中敌人数目小于K的区域数量。参数:N: 战场网格的行数M: 战场网格的列数K: 敌人数目的阈值grid: 表示战场网格的二维列表,其中 'E' 表示敌人,'.' 表示空地,'#' 表示障碍物返回:敌人数目小于K的区域数量"""def dfs(i, j, count):"""深度优先搜索函数,用于计算从网格(i, j)开始的区域内的敌人数目。参数:i: 网格的行索引j: 网格的列索引count: 当前区域内已计算的敌人数目返回:当前区域内的敌人数目"""# 检查索引是否越界,当前网格是否为障碍物,或者已经访问过if i < 0 or i >= N or j < 0 or j >= M or grid[i][j] == '#' or visited[i][j]:return# 标记当前网格为已访问visited[i][j] = True# 如果当前网格有敌人,增加计数if grid[i][j] == 'E':count += 1# 定义四个方向,分别表示右、左、下、上directions = [(0, 1), (0, -1), (1, 0), (-1, 0)]# 遍历四个方向,进行深度优先搜索for dx, dy in directions:dfs(i + dx, j + dy, count)# 返回当前区域内的敌人数目return count# 初始化visited二维列表,用于标记网格是否被访问过visited = [[False] * M for _ in range(N)]# 初始化结果变量,用于记录敌人数目小于K的区域数量result = 0# 遍历战场网格的每一个位置for i in range(N):for j in range(M):# 如果当前网格不是障碍物且未被访问过if grid[i][j] != '#' and not visited[i][j]:# 计算从当前网格开始的区域内的敌人数目enemy_count = dfs(i, j, 0)# 如果敌人数目小于K,增加结果变量if enemy_count < K:result += 1# 返回敌人数目小于K的区域数量return result# 示例输入
N = 3
M = 5
K = 2
grid = ["..#EE","E.#E.","#..E#"
]# 调用函数并输出结果
print(battlefield_enemy_count(N, M, K, grid)) # 输出: 1
七、代码示例(java)
以下是使用Java实现的“战场索敌”问题解决方案。这个实现利用了深度优先搜索(DFS)算法来遍历战场地图,并统计每个连通区域中的敌人数量。
import java.util.Scanner;public class BattlefieldEnemyCount {// 四个方向的行列偏移量,分别代表右、左、下、上private static final int[][] DIRECTIONS = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取输入int N = scanner.nextInt();int M = scanner.nextInt();int K = scanner.nextInt();scanner.nextLine(); // 读取换行符char[][] grid = new char[N][M];for (int i = 0; i < N; i++) {grid[i] = scanner.nextLine().toCharArray();}// 调用函数计算结果int result = countRegionsWithLessThanKEnemies(N, M, K, grid);// 输出结果System.out.println(result);}/*** 计算地图中敌人数目小于K的区域数量* * @param N 地图的行数* @param M 地图的列数* @param K 敌人数目的阈值* @param grid 表示地图的二维字符数组,其中'#'表示障碍物,'E'表示敌人,'.'表示空地* @return 返回敌人数目小于K的区域数量*/public static int countRegionsWithLessThanKEnemies(int N, int M, int K, char[][] grid) {// 初始化访问标记数组boolean[][] visited = new boolean[N][M];// 初始化区域计数为0int regionCount = 0;// 遍历地图中的每个位置for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {// 如果当前位置是空地且未被访问过,则开始DFS搜索if (grid[i][j] != '#' && !visited[i][j]) {// dfs函数返回从当前位置开始的区域中的敌人数量int enemyCount = dfs(i, j, grid, visited);// 如果敌人数量小于K,则区域计数加1if (enemyCount < K) {regionCount++;}}}}// 返回敌人数目小于K的区域数量return regionCount;}/* 深度优先搜索函数,用于计算从(i, j)位置出发能遇到的敌人数量** 参数i, j表示当前位置,grid表示地图,visited表示访问状态数组返回值为从当前位置出发遇到的敌人总数* **/private static int dfs(int i, int j, char[][] grid, boolean[][] visited) {int enemyCount = 0;// 检查边界条件和访问状态// 如果当前位置越界、已被访问或遇到障碍物('#'),则返回0if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || visited[i][j] || grid[i][j] == '#') {return enemyCount;}// 标记当前位置为已访问visited[i][j] = true;// 如果当前位置是敌人,则敌人计数加1if (grid[i][j] == 'E') {enemyCount++;}// 对四个方向进行递归搜索// DIRECTIONS是一个预定义的数组,包含四个方向的行和列增量for (int[] direction : DIRECTIONS) {int newRow = i + direction[0];int newCol = j + direction[1];enemyCount += dfs(newRow, newCol, grid, visited);}// 返回从当前位置出发遇到的敌人总数return enemyCount;}
}
代码说明:
-
输入处理:
- 使用
Scanner
类读取输入的行数N
、列数M
、目标敌人数量K
以及战场地图grid
。
- 使用
-
主函数:
countRegionsWithLessThanKEnemies
函数负责遍历整个地图,并对每个未被访问过的空地位置调用DFS函数。- 如果DFS返回的敌人数量小于
K
,则增加区域计数。
-
DFS函数:
dfs
函数执行深度优先搜索,递归地访问当前位置的四个相邻位置。- 使用
visited
数组来跟踪已访问的位置,以避免重复访问。 - 如果当前位置是敌人,则增加敌人计数。
-
输出:
- 最后,输出满足条件的区域数量。
你可以将上述代码复制到你的Java开发环境中进行编译和运行,并根据需要调整输入部分来测试不同的战场地图。
八、详细运行示例解析
输入:
3 5 2
..#EE
E.#E.
###..
1234
输入解析:
3 5 2
表示地图有3行5列,且我们关心敌人数量小于2的区域。- 接下来的三行是地图:
其中,..#EE E.#E. ###..
.
表示空地,#
表示墙壁(障碍物),E
表示敌人。
代码运行流程:
-
初始化:
Scanner
用于读取输入。grid
二维字符数组用于存储地图。visited
二维布尔数组用于标记哪些位置已被访问。regionCount
用于记录敌人数量小于2的区域数量。
-
读取输入:
- 使用
Scanner
读取行数N
、列数M
和阈值K
。 - 读取地图并存储在
grid
中。
- 使用
-
遍历地图:
- 双重循环遍历地图的每个位置。
- 对于每个未访问过的空地位置,调用
dfs
函数计算该位置所在区域的敌人数量。
-
深度优先搜索(DFS):
- 从当前位置
(i, j)
开始,递归地搜索四个方向。 - 使用
visited
数组避免重复访问。 - 如果遇到敌人,增加
enemyCount
。 - 递归调用
dfs
处理相邻位置。
- 从当前位置
-
判断并计数:
- 在遍历地图的过程中,如果某个区域的敌人数量小于
K
(即2),则regionCount
加1。
- 在遍历地图的过程中,如果某个区域的敌人数量小于
-
输出结果:
- 打印
regionCount
,即敌人数量小于2的区域数量。
- 打印
运行示例解析:
-
区域1(左上角
..#EE
中的..EE
部分):- 敌人数量:2
- 不满足条件(敌人数量小于2),不计入
regionCount
。
-
区域2(中间
E.#E.
部分):- 敌人数量:2
- 不满足条件(敌人数量小于2),不计入
regionCount
。
-
区域3(由于墙壁分隔,
###..
中的..
是一个独立的空地区域,但无敌人):- 敌人数量:0
- 满足条件(敌人数量小于2),
regionCount
加1。
输出结果:
1
因此,根据给定的输入和代码实现,输出结果为1,表示有一个区域的敌人数量小于2。这个区域是地图右下角的独立空地区域(无敌人)。
九、总结
华为OD机试真题“战场索敌”是一道考察算法和数据结构应用能力的题目。通过理解题目要求、确定算法和实现步骤,我们可以使用深度优先搜索(DFS)算法来遍历地图并统计每个区域内的敌人数量。最后,根据题目要求输出结果即可。
相关文章:
华为OD机试真题---战场索敌
华为OD机试真题“战场索敌”是一道考察算法和数据结构应用能力的题目。以下是对该题目的详细解析: 一、题目描述 有一个大小是NM的战场地图,被墙壁’#‘分隔成大小不同的区域。上下左右四个方向相邻的空地’.‘属于同一个区域,只有空地上可…...

计算机网络 (53)互联网使用的安全协议
一、SSL/TLS协议 概述: SSL(Secure Sockets Layer)安全套接层和TLS(Transport Layer Security)传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发,广泛应用于基于万维网的各种网络…...

c++算法贪心系列
本篇文章,同大家一起学习贪心算法!!! 第一题 题目链接 2208. 将数组和减半的最少操作次数 - 力扣(LeetCode) 题目解析 本题重点:最终的数组和要小于原数组和的一半,且求这一操作的…...

【Maui】注销用户,采用“手势”点击label弹窗选择
文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 方法一:前端绑定3.2 方法二:后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创…...

智慧脚下生根,智能井盖监测终端引领城市安全新革命
在繁忙的都市生活中,我们往往只关注地面的繁华与喧嚣,却忽略了隐藏在地面之下的基础设施——井盖。这些看似不起眼的井盖,实则承担着排水、通讯、电力等重要功能,是城市安全运转的重要一环。然而,传统的井盖管理面临着…...

Word2Vec如何优化从中间层到输出层的计算?
文章目录 Word2Vec如何优化从中间层到输出层的计算?用负采样优化中间层到输出层的计算负采样方法的关键思想负采样的例子负采样的采样方法 Word2Vec如何优化从中间层到输出层的计算? 重要性:★★ 用负采样优化中间层到输出层的计算 以词汇…...
第七篇:vue3 计算属性:computed
v-model "firstName". // v-model. 就是双向绑定的意思 <br/> // 通过 v-model 进行绑定姓:<input type"text" v-model "firstName"><br/>名:<input type"text" v-model"lastN…...
搭建k8s集群
一、准备工作(所有节点) 在开始部署之前,我们需要对所有节点进行以下准备工作。 1.1、关闭防火墙 # 关闭防火墙 systemctl stop firewalld# 禁止防火墙开机自启 systemctl disable firewalld1.2、 关闭 SELinux # 永久关闭 SELinux sed -…...
Android SystemUI——最近任务应用列表(十七)
对于最近任务应用列表来说,在 Android 原生 SystemUI 中是一个单独的组件。 <string-array name="config_systemUIServiceComponents" translatable="false">……<item>com.android.systemui.recents.Recents</item> </string-arra…...

java 根据前端传回的png图片数组,后端加水印加密码生成pdf,返回给前端
前端传回的png图片数组,后端加水印加密码生成pdf,返回给前端 场景:重点:maven依赖controllerservice 场景: 当前需求,前端通过html2canvas将页面报表生成图片下载,可以仍然不满意。 需要java后…...
《探秘鸿蒙Next:如何保障AI模型轻量化后多设备协同功能一致》
在鸿蒙Next的多设备协同场景中,确保人工智能模型轻量化后功能的一致性是一项极具挑战性但又至关重要的任务。以下是一些关键的方法和策略。 统一的模型架构与标准 采用标准化框架:选择如TensorFlow Lite、PyTorch Mobile等在鸿蒙Next上适配良好的轻量化…...
C语言二级
//请编写函数fun(),该函数的功能是:计算并输出给定整数n的所有因 //子(不包括1和自身)之和。规定n的值不大于1000。例如,在主函数 //中从键盘给n输入的值为856,则输出为:sum 763。 //注意&…...

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全
RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具,采用先进的 WinUI 3 框架开发,以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观,还提供了多样化的系统优化选项,旨在帮助用户最大化设备…...
rust学习-宏的定义与使用
rust学习-宏的定义与使用 声明宏(macro_rules! 宏)使用方式1. 简单的宏2. 带参数的宏3. 多个模式的宏 过程宏1. 定义过程宏1.1 属性宏1.2 函数宏1.3 派生宏 2. 使用过程宏2.1 属性宏2.2 函数宏2.3 派生宏 在 Rust 中,宏(macro&…...
【学习总结|DAY032】后端Web实战:登录认证
在 Web 后端开发中,登录认证是保障系统安全和用户数据隐私的关键环节。本文将结合实际开发案例,深入探讨登录功能与登录校验的实现思路和技术细节,希望能帮助读者更好地掌握这一重要知识点。 一、登录功能实现 1.1 思路分析 登录功能的核心…...
leetcode 123. 买卖股票的最佳时机 III
题目:123. 买卖股票的最佳时机 III - 力扣(LeetCode) O(N)的算法: f[i] max(max(0, prices[i] - min(prices[0], prices[1], ... , prices[i - 1)), f[i - 1]); g[i] max(max(0, max(prices[i 1], prices[i 2], ... , pric…...
Apache Tika 详解
Apache Tika是一个开源的、跨平台的库,专门用于检测、提取和解析多种文件格式的元数据。以下是对Apache Tika的详细解析: 一、概述 Apache Tika旨在为各种类型的数据提取提供一个单一的API,它支持多种文件格式,包括文档、图片、…...

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认
OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务(DDoS)攻击,而OpenAI尚未承认这一漏洞。 本月,德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章,解释了如何通过向ChatGPT API发送单个HTTP请求…...
Qt——界面优化
在Qt中进行界面优化,可以从以下几个方面入手: 1.使用QWidget:setVisible来控制Widget的 显示和隐藏,而不是删除和重建。 2.使用QPainter直 接绘制组件,避免使用复杂的布局。 3.使用QSS进行样式设置, 减少图片资源的使用。 4.使…...

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加
【1】引言 前序已经学习了直接在画布上使用掩模,会获得彩色图像的多种叠加效果,相关文章链接为: python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖-CSDN博客 这时候如果更进一步,直接…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...