华为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)算法来遍历地图并统计每个区域内的敌人数量。最后,根据题目要求输出结果即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下使用docker执行器并配置 hosts 解析

本篇目录 1. 问题背景2. 环境准备2.1 云上开通windows 2022 英文版机器2.1.1 安装 git2.1.2 安装 runner2.1.3 装docker2.1.4 注册runner并使用docker执行器 3. 项目信息3.1 编写window bat脚本3.2 项目.gitlab-ci.yml文件 4. 测试结论4.1 运行流水线 5. troubleshooting问题1&…

计算机毕业设计hadoop+spark视频推荐系统 短视频推荐系统 视频流量预测系统 短视频爬虫 视频数据分析 视频可视化 视频大数据 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

mysql的主从配置

#mysql数据库 #主从 MySQL数据库主从配置 1.MySQL主从介绍 MySQL 主从又叫做 Replication、AB 复制。简单讲就是 A 和 B 两台机器做主 从后&#xff0c;在 A 上写数据&#xff0c;另外一台 B 也会跟着写数据&#xff0c;两者数据实时同步的。 MySQL 主从是基于 binlog 的&…

MySQL、HBase、ES的特点和区别

MySQL&#xff1a;关系型数据库&#xff0c;主要面向OLTP&#xff0c;支持事务&#xff0c;支持二级索引&#xff0c;支持sql&#xff0c;支持主从、Group Replication架构模型&#xff08;本文全部以Innodb为例&#xff0c;不涉及别的存储引擎&#xff09;。 HBase&#xff1…

前端开发中的模拟后端与MVVM架构实践[特殊字符][特殊字符][特殊字符]

平时&#xff0c;后端可能不能及时给接口给前端进行数据调用和读取。这时候&#xff0c;前端想到进行模拟后端接口。本文将介绍如何通过vite-plugin-mock插件模拟后端接口&#xff0c;并探讨MVVM架构在前端开发中的应用。此外&#xff0c;我们还将讨论Vue2与Vue3的区别&#xf…

HTML5 新表单属性详解

HTML5 为 <form> 和 <input> 标签引入了一系列新属性&#xff0c;极大地增强了表单的功能和用户体验。这些新属性不仅简化了开发者的工作&#xff0c;还为用户提供了更友好、更高效的交互方式。本文将详细介绍这些新属性&#xff0c;并结合代码示例帮助大家更好地理…

SuperdEye:一款基于纯Go实现的间接系统调用执行工具

关于SuperdEye SuperdEye是一款基于纯Go实现的间接系统调用执行工具&#xff0c;该工具是TartarusGate 的修订版&#xff0c;可以利用Go来实现TartarusGate 方法进行间接系统调用。 该工具的目标是为了扫描挂钩的NTDLL并检索Syscall编号&#xff0c;然后使用它来执行间接系统调…

MySQL可直接使用的查询表的列信息

文章目录 背景实现方案模板SQL如何查询列如何转大写如何获取字符位置如何拼接字段 SQL适用场景 背景 最近产品找来&#xff0c;想让帮忙出下表的信息&#xff0c;字段驼峰展示&#xff0c;每张表信息show create table全部展示&#xff0c;再逐个粘贴&#xff0c;有点太耗费时…

HMV Challenges 022 Writeup

题目地址&#xff1a;https://hackmyvm.eu/challenges/challenge.php?c022 首先猜测是否为图片隐写&#xff0c;无果 盲猜图片上的小鸟是某种带符号的隐写 去这个网站找找看&#xff1a;https://www.dcode.fr/chiffres-symboles 找到了 参照原图片鸟儿的姿态选择并排放 所…

不建模,无代码,如何构建一个3D虚拟展厅?

在数字化浪潮的推动下&#xff0c;众多企业正积极探索线上3D虚拟展厅这一新型展示平台&#xff0c;旨在以更加生动、直观的方式呈现其产品、环境与综合实力。然而&#xff0c;构建一个既专业又吸引人的3D虚拟展厅并非易事&#xff0c;它不仅需要深厚的技术支持&#xff0c;还需…

【真机调试】前端开发:移动端特殊手机型号有问题,如何在电脑上进行调试?

目录 前言一、怎么设置成开发者模式&#xff1f;二、真机调试基本步骤&#xff1f; &#x1f680;写在最后 前言 edge浏览器 edge://inspect/#devices 谷歌浏览器&#xff08;开tizi&#xff09; chrome://inspect 一、怎么设置成开发者模式&#xff1f; Android 设备 打开设…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG&#xff08;检索增强生成&#xff09;技术应用不断发展的背景下&#xff0c;掌握文本相似算法不仅能够助力信息检索&…

校园网上店铺的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园店铺商品销售信息管理难度大&#xff0c;容错率低&a…

基于springboot+vue的校园二手物品交易系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

编译Android平台使用的FFmpeg库

目录 前言 一、编译环境 二、搭建环境 1.安装MSYS2 2.更新系统包 2.1 打开MSYS2 MinGW 64-bit终端&#xff08;mingw64.exe&#xff09; 2.2 更新所有软件包到最新版本 2.3 安装必要的工具和库。 3. 克隆FFmpeg源码 4. 配置编译选项 5. 执行编译 总结 前言 记录学习…

vim如何显示行号

:set nu 显示行号 :set nonu 不显示行号

揭开C++ 继承 的神秘面纱:深度剖析 类 的“血脉”传承

在C的面向对象编程中&#xff0c;继承&#xff08;Inheritance&#xff09;是实现代码复用和层次结构的重要特性。通过继承&#xff0c;新的类&#xff08;派生类&#xff09;可以从现有的类&#xff08;基类&#xff09;中继承属性和行为&#xff0c;从而减少重复代码&#xf…

翻译:How do I reset my FPGA?

文章目录 背景翻译&#xff1a;How do I reset my FPGA?1、Understanding the flip-flop reset behavior2、Reset methodology3、Use appropriate resets to maximize utilization4、Many options5、About the author 背景 在写博客《复位信号的同步与释放&#xff08;同步复…

基于微信小程序的设备故障报修管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

ue5 GAS制作一个技能

新建文件夹 ability 取名BP_BaseAbility 新建一个技能GAB_Melee 上面技能GAB_Melee和技能基类BP_BaseAbility 进入技能GAB_Melee&#xff0c;添加打印火云掌 给这个技能添加标签 点这个号 这样命名&#xff0c;小心这个点&#xff08;.&#xff09;作为分割 ability.ha…