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

华为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

五、解题思路

  1. 理解题目

    • 首先,明确题目要求统计的是敌人数小于K的区域数量。
    • 地图被墙壁’#‘分隔成不同的区域,每个区域内的空地’.‘是连通的,且只有空地上可能存在敌人’E’。
  2. 确定算法

    • 由于需要遍历地图并统计每个区域内的敌人数量,可以使用深度优先搜索(DFS)或广度优先搜索(BFS)算法来遍历每个区域。
    • 在遍历过程中,使用一个计数器来统计每个区域内的敌人数量,并判断该数量是否小于K。
  3. 实现步骤

    • 初始化一个二维布尔数组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;}
}
代码说明:
  1. 输入处理

    • 使用Scanner类读取输入的行数N、列数M、目标敌人数量K以及战场地图grid
  2. 主函数

    • countRegionsWithLessThanKEnemies函数负责遍历整个地图,并对每个未被访问过的空地位置调用DFS函数。
    • 如果DFS返回的敌人数量小于K,则增加区域计数。
  3. DFS函数

    • dfs函数执行深度优先搜索,递归地访问当前位置的四个相邻位置。
    • 使用visited数组来跟踪已访问的位置,以避免重复访问。
    • 如果当前位置是敌人,则增加敌人计数。
  4. 输出

    • 最后,输出满足条件的区域数量。

你可以将上述代码复制到你的Java开发环境中进行编译和运行,并根据需要调整输入部分来测试不同的战场地图。

八、详细运行示例解析

输入:
3 5 2
..#EE
E.#E.
###..
1234
输入解析:
  • 3 5 2 表示地图有3行5列,且我们关心敌人数量小于2的区域。
  • 接下来的三行是地图:
    ..#EE
    E.#E.
    ###..
    
    其中,. 表示空地,# 表示墙壁(障碍物),E 表示敌人。
代码运行流程:
  1. 初始化

    • Scanner 用于读取输入。
    • grid 二维字符数组用于存储地图。
    • visited 二维布尔数组用于标记哪些位置已被访问。
    • regionCount 用于记录敌人数量小于2的区域数量。
  2. 读取输入

    • 使用Scanner读取行数N、列数M和阈值K
    • 读取地图并存储在grid中。
  3. 遍历地图

    • 双重循环遍历地图的每个位置。
    • 对于每个未访问过的空地位置,调用dfs函数计算该位置所在区域的敌人数量。
  4. 深度优先搜索(DFS)

    • 从当前位置(i, j)开始,递归地搜索四个方向。
    • 使用visited数组避免重复访问。
    • 如果遇到敌人,增加enemyCount
    • 递归调用dfs处理相邻位置。
  5. 判断并计数

    • 在遍历地图的过程中,如果某个区域的敌人数量小于K(即2),则regionCount加1。
  6. 输出结果

    • 打印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机试真题“战场索敌”是一道考察算法和数据结构应用能力的题目。以下是对该题目的详细解析&#xff1a; 一、题目描述 有一个大小是NM的战场地图&#xff0c;被墙壁’#‘分隔成大小不同的区域。上下左右四个方向相邻的空地’.‘属于同一个区域&#xff0c;只有空地上可…...

计算机网络 (53)互联网使用的安全协议

一、SSL/TLS协议 概述&#xff1a; SSL&#xff08;Secure Sockets Layer&#xff09;安全套接层和TLS&#xff08;Transport Layer Security&#xff09;传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发&#xff0c;广泛应用于基于万维网的各种网络…...

c++算法贪心系列

本篇文章&#xff0c;同大家一起学习贪心算法&#xff01;&#xff01;&#xff01; 第一题 题目链接 2208. 将数组和减半的最少操作次数 - 力扣&#xff08;LeetCode&#xff09; 题目解析 本题重点&#xff1a;最终的数组和要小于原数组和的一半&#xff0c;且求这一操作的…...

【Maui】注销用户,采用“手势”点击label弹窗选择

文章目录 前言一、问题描述二、解决方案三、软件开发&#xff08;源码&#xff09;3.1 方法一&#xff1a;前端绑定3.2 方法二&#xff1a;后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架&#xff0c;用于使用 C# 和 XAML 创…...

智慧脚下生根,智能井盖监测终端引领城市安全新革命

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

Word2Vec如何优化从中间层到输出层的计算?

文章目录 Word2Vec如何优化从中间层到输出层的计算&#xff1f;用负采样优化中间层到输出层的计算负采样方法的关键思想负采样的例子负采样的采样方法 Word2Vec如何优化从中间层到输出层的计算&#xff1f; 重要性&#xff1a;★★ 用负采样优化中间层到输出层的计算 以词汇…...

第七篇:vue3 计算属性:computed

v-model "firstName". // v-model. 就是双向绑定的意思 <br/> // 通过 v-model 进行绑定姓&#xff1a;<input type"text" v-model "firstName"><br/>名&#xff1a;<input type"text" v-model"lastN…...

搭建k8s集群

一、准备工作&#xff08;所有节点&#xff09; 在开始部署之前&#xff0c;我们需要对所有节点进行以下准备工作。 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图片数组&#xff0c;后端加水印加密码生成pdf&#xff0c;返回给前端 场景&#xff1a;重点&#xff1a;maven依赖controllerservice 场景&#xff1a; 当前需求&#xff0c;前端通过html2canvas将页面报表生成图片下载&#xff0c;可以仍然不满意。 需要java后…...

《探秘鸿蒙Next:如何保障AI模型轻量化后多设备协同功能一致》

在鸿蒙Next的多设备协同场景中&#xff0c;确保人工智能模型轻量化后功能的一致性是一项极具挑战性但又至关重要的任务。以下是一些关键的方法和策略。 统一的模型架构与标准 采用标准化框架&#xff1a;选择如TensorFlow Lite、PyTorch Mobile等在鸿蒙Next上适配良好的轻量化…...

C语言二级

//请编写函数fun()&#xff0c;该函数的功能是&#xff1a;计算并输出给定整数n的所有因 //子&#xff08;不包括1和自身&#xff09;之和。规定n的值不大于1000。例如&#xff0c;在主函数 //中从键盘给n输入的值为856&#xff0c;则输出为&#xff1a;sum 763。 //注意&…...

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全

RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具&#xff0c;采用先进的 WinUI 3 框架开发&#xff0c;以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观&#xff0c;还提供了多样化的系统优化选项&#xff0c;旨在帮助用户最大化设备…...

rust学习-宏的定义与使用

rust学习-宏的定义与使用 声明宏&#xff08;macro_rules! 宏&#xff09;使用方式1. 简单的宏2. 带参数的宏3. 多个模式的宏 过程宏1. 定义过程宏1.1 属性宏1.2 函数宏1.3 派生宏 2. 使用过程宏2.1 属性宏2.2 函数宏2.3 派生宏 在 Rust 中&#xff0c;宏&#xff08;macro&…...

【学习总结|DAY032】后端Web实战:登录认证

在 Web 后端开发中&#xff0c;登录认证是保障系统安全和用户数据隐私的关键环节。本文将结合实际开发案例&#xff0c;深入探讨登录功能与登录校验的实现思路和技术细节&#xff0c;希望能帮助读者更好地掌握这一重要知识点。 一、登录功能实现 1.1 思路分析 登录功能的核心…...

leetcode 123. 买卖股票的最佳时机 III

题目&#xff1a;123. 买卖股票的最佳时机 III - 力扣&#xff08;LeetCode&#xff09; O(N)的算法&#xff1a; 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是一个开源的、跨平台的库&#xff0c;专门用于检测、提取和解析多种文件格式的元数据。以下是对Apache Tika的详细解析&#xff1a; 一、概述 Apache Tika旨在为各种类型的数据提取提供一个单一的API&#xff0c;它支持多种文件格式&#xff0c;包括文档、图片、…...

ChatGPT被曝存在爬虫漏洞,OpenAI未公开承认

OpenAI的ChatGPT爬虫似乎能够对任意网站发起分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;而OpenAI尚未承认这一漏洞。 本月&#xff0c;德国安全研究员Benjamin Flesch通过微软的GitHub分享了一篇文章&#xff0c;解释了如何通过向ChatGPT API发送单个HTTP请求…...

Qt——界面优化

在Qt中进行界面优化&#xff0c;可以从以下几个方面入手: 1.使用QWidget:setVisible来控制Widget的 显示和隐藏&#xff0c;而不是删除和重建。 2.使用QPainter直 接绘制组件&#xff0c;避免使用复杂的布局。 3.使用QSS进行样式设置&#xff0c; 减少图片资源的使用。 4.使…...

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加

【1】引言 前序已经学习了直接在画布上使用掩模&#xff0c;会获得彩色图像的多种叠加效果&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;四十&#xff09;掩模&#xff1a;三通道图像的局部覆盖-CSDN博客 这时候如果更进一步&#xff0c;直接…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

解析“道作为序位生成器”的核心原理

解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制&#xff0c;重点解析"道作为序位生成器"的核心原理与实现框架&#xff1a; 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...