华为OD机试 - 战场索敌 - 深度优先搜索dfs算法(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、深度优先搜索dfs
    • 五、解题思路
    • 六、Java算法源码
    • 七、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、如果增加目标敌人数量K为5
      • 5、来,上强度

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

一、题目描述

有一个大小是N*M的战场地图,被枪毙 ‘#’ 分隔成大小不同的区域,上下左右四个方向相邻的空地’.',属于同一个区域,只有空地上可能存在敌人 ‘E’ ,请求出地图上总共有多少区域里的敌人数小于K。

二、输入描述

第一行输入为N,M,K;

  • N表示地图的行数;
  • M表示地图的列数;
  • K表示目标敌人数量;

取值范围:

N <= 100 、 M <= 100

第二行开始为N * M大小的字符数组。

三、输出描述

敌人数小于K的区域数量。

四、深度优先搜索dfs

在我们遇到的一些问题当中,有些问题我们不能够确切的找出数学模型,即找不出一种直接求解的方法,解决这一类问题,我们一般采用搜索的方法解决。搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况(实际上就是穷举);

对于问题的第一个状态,叫初始状态,要求的状态叫目标状态。
搜索就是把规则应用于实始状态,在其产生的状态中,直到得到一个目标状态为止。
产生新的状态的过程叫扩展(由一个状态,应用规则,产生新状态的过程)。

搜索的要点:

  1. 初始状态;
  2. 重复产生新状态;
  3. 检查新状态是否为目标,是结束,否转(2);

如果搜索是以接近起始状态的程序依次扩展状态的,叫宽度优先搜索。

如果扩展是首先扩展新产生的状态,则叫深度优先搜索。

深度优先搜索用一个数组存放产生的所有状态。

  1. 把初始状态放入数组中,设为当前状态;
  2. 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态;
  3. 判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态;
  4. 判断当前状态是否为目标状态,如果是目标,则找到一个解答,结束算法;
  5. 如果数组为空,说明无解。

五、解题思路

  1. 第一行输入三个数,分别是:地图的行数N、地图的列数M、目标敌人数量K;
  2. 通过Java8 Steam分隔初始化N、M、K;
  3. 定义一个二维数组visitedMatrix,记录是否被访问过;
  4. 定义二维矩阵matrix,存储N * M大小的字符数组;
  5. 定义变量areaSum,存储敌人数小于K的区域数量;
  6. 利用深度优先搜索dfs算法,获取敌人数小于K的区域数量;
  7. 输出敌人数小于K的区域数量。

六、Java算法源码

package com.guor.od;import java.util.Scanner;
import java.util.*;public class OdTest {public static boolean[][] visitedMatrix;public static int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public static void main(String[] args) {Scanner in = new Scanner(System.in);int[] arr = Arrays.stream(in.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();// 地图的行数int N = arr[0];// 地图的列数int M = arr[1];// 目标敌人数量int K = arr[2];// 矩阵某值是否被访问过visitedMatrix = new boolean[N][M];// 定义二维矩阵,存储N * M大小的字符数组char[][] matrix = new char[N][];for (int i = 0; i < N; i++) {matrix[i] = in.nextLine().toCharArray();}// 敌人数小于K的区域数量int areaSum = 0;for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {if (visitedMatrix[i][j] || matrix[i][j] == '#') {continue;}// 利用深度优先搜索dfs算法,获取敌人数小于K的区域数量areaSum += dfs(i, j, matrix, N, M) < K ? 1 : 0;}}// 输出敌人数小于K的区域数量System.out.println(areaSum);}/*** 利用深度优先搜索dfs算法,获取敌人数小于K的区域数量** @param i 地图的行数,由0开始的变量* @param j 地图的列数,由0开始的变量* @param matrix 二维矩阵,N * M大小的字符数组* @param N 矩阵的总行数* @param M 矩阵的总列数* @return*/public static int dfs(int i, int j, char[][] matrix, int N, int M) {// 敌军数量int enemy_count = 0;// 访问过visitedMatrix[i][j] = true;// 存在敌人 ‘E’,敌军数量+1if (matrix[i][j] == 'E') {enemy_count += 1;}// 栈中保存敌军的位置列表LinkedList<int[]> stack = new LinkedList<>();stack.add(new int[]{i, j});while (stack.size() > 0) {int[] pos = stack.removeLast();int x = pos[0], y = pos[1];// 上下左右四个方向for (int k = 0; k < 4; k++) {int new_x = x + directions[k][0];int new_y = y + directions[k][1];if (new_x >= 0 && new_x < N && new_y >= 0 && new_y < M && !visitedMatrix[new_x][new_y] && matrix[new_x][new_y] != '#') {// 访问过visitedMatrix[new_x][new_y] = true;// 存在敌人 ‘E’,敌军数量+1if (matrix[new_x][new_y] == 'E') {enemy_count += 1;}stack.add(new int[]{new_x, new_y});}}}// 敌人数小于K的区域数量return enemy_count;}
}

七、效果展示

1、输入

4 6 3
…#EE.
E.#E…
#E#.E.
#.#…

2、输出

1

3、说明

地图被墙壁分为两个区域,左边区域有2个敌人,右边区域有4个敌人,符合条件的区域数量是1。

在这里插入图片描述

4、如果增加目标敌人数量K为5

地图被墙壁分为两个区域,左边区域有2个敌人,右边区域有4个敌人,符合条件的区域数量是2。

在这里插入图片描述

5、来,上强度

6 8 4
…#EE.#E
E.#E…#.
#E#.E.#.
#.#…#E
#.#.E.#E
#.#…#.

我草,不至于吧,哪吒,这眼花缭乱的,你这是“战场索鬼”吧?

好吧,上截图。

在这里插入图片描述

  • 如上图所示,战场被枪毙 ‘#’ 分隔成大小不同的区域
    1. 第一个区域2个敌人;
    2. 第二个区域5个敌人;
    3. 第三个区域3个敌人。
  • 目标敌人数量是4;
  • 敌人数小于K的区域数量为2;

🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

RNA 36. SCI 文基于转录组数据识别CNV并可视化 (CaSpER)

转录组生信分析教程 桓峰基因公众号推出转录组分析教程&#xff0c;有需要生信的老师可以联系我们&#xff01;转录分析教程整理如下&#xff1a; RNA 1. 基因表达那些事--基于 GEO RNA 2. SCI文章中基于GEO的差异表达基因之 limma RNA 3. SCI 文章中基于T CGA 差异表达基因之 …

python28种极坐标绘图函数总结

文章目录 基础图误差线等高线polar场图polar统计图非结构坐标图 &#x1f4ca;python35种绘图函数总结&#xff0c;3D、统计、流场&#xff0c;实用性拉满 matplotlib中的画图函数&#xff0c;大部分情况下只要声明坐标映射是polar&#xff0c;就都可以画出对应的极坐标图。但…

基于SSM的校园美食交流系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

2023-9-10 集合-Nim游戏

题目链接&#xff1a;集合-Nim游戏 #include <iostream> #include <cstring> #include <algorithm> #include <unordered_set>using namespace std;const int N 110, M 10010;int n, m; int s[N], f[M];int sg(int x) {if(f[x] ! -1) return f[x];//…

【补】代码随想录算法训练营day38|动态规划 |509. 斐波那契数|70. 爬楼梯|746. 使用最小花费爬楼梯

动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#xff0c;贪心没有状态推…

【初阶C语言】操作符1--对二进制的操作

前言&#xff1a;本节内容介绍的操作符&#xff0c;操作的对象是二进制位。所以前面先介绍整数的二进制位 一、二进制位介绍 1.二进制介绍 &#xff08;1&#xff09;整数的二进制表示形式有三种&#xff1a;原码、反码和补码。 &#xff08;2&#xff09;原码、反码和补码的…

conda的使用教程

conda的介绍 简单来说&#xff0c;conda软件就是来管理包的软件。以Python为例&#xff0c;在实际生活中&#xff0c;我们要处理多个不同的项目&#xff0c;因此&#xff0c;要安装不同的项目所需要的包&#xff0c;为了管理方便&#xff0c;conda就是用来打理不同项目的包&…

Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

目录 一、消费者组详细消费流程图解二、消费者的重要参数 一、消费者组详细消费流程图解 创建一个消费者网络连接客户端&#xff0c;主要用于与kafka集群进行交互&#xff0c;如下图所示&#xff1a; 调用sendFetches发送消费请求&#xff0c;如下图所示&#xff1a; (1)、Fet…

什么是50ETF期权开户条件,怎么开期权交易权限?

50ETF期权是指上证50ETF期权&#xff0c;标的物是上证50ETF&#xff0c;代码是&#xff08;510500&#xff09;&#xff0c;期权是一种在上证50ETF基础上进行衍生品交易的金融工具&#xff0c;下文科普什么是50ETF期权开户条件&#xff0c;怎么开期权交易权限&#xff1f;本文来…

FFmpeg入门之FFmpeg源码编译

1.源码下载: git clone https://github.com/FFmpeg/FFmpeg.git windows : macos: ubuntu: 2.编译FFmpeg CompilationGuide – FFmpeg windows: 1.下载yasm并安装 : Download - The Yasm Modular Assembler Project 下载后复制到c:/windows 2.下载SDL 3.下载H264/265源码 git…

css画一条渐变的虚线

效果展示 原理&#xff1a;给元素设置一个渐变的背景色&#xff0c;画一条白色的虚线盖住背景&#xff0c;就达到了渐变虚线的效果 代码&#xff1a; <div class"pending-line"></div>.pending-line{width: 101px;border-top: 2px dashed #fff; // do…

C语言之指针进阶篇(2)

目录 函数指针 函数名和&函数名 函数指针的定义 函数指针的使用 函数指针陷阱 代码1 代码2 注意 函数指针数组定义 函数指针数组的使用 指向函数指针数组的指针 书写 终于军训圆满结束了&#xff0c;首先回顾一下指针进阶篇&#xff08;1&#xff09;主要是…

Vivado 添加FPGA开发板的Boards file的添加

1 digilent board file 下载地址 下载地址 &#xff1a; https://github.com/Digilent/vivado-boards 2 下载后 3 添加文件到 vivado 安装路径 把文件复制到 Vivado\2019.1\data\boards\board_files4 创建工程查看是否安装成功

Java EE企业级开发学习 -- day1

什么是Java EE? 它是基于Java语言的一种软件设计体系结构&#xff0c;它是一种标准中间件体系结构。它的作用在于能标准化企业级多层结构应用系统的部署&#xff0c;并且简化开发环境。 具体环境的搭建 1.下载压缩包于安装包 jdk-8u261-windows-x64 eclipse-jee-2018-12-…

pytorch再次学习

目录 基础数据可视化切换设备device定义神经网络类打印每层的参数大小自动微分计算梯度禁用梯度追踪优化模型参数 模型保存模型加载 进阶padding更准确的补法ReLU增加计算量但是减少内存消耗的办法输出合并自适应平均池化&#xff08;将输入shape变成指定的输出shape&#xff0…

一个产品级MCU菜单框架设计

分享一个用单色屏做的菜单框架。代码托管在github&#xff1a; https://github.com/wujique/stm32f407/tree/sw_arch 1、概述 本处所说的菜单是用在128*64这种小屏幕的菜单&#xff0c;例如下面这种&#xff0c;不是彩屏上的GUI。 2、菜单框架设计 作为一个底层驱动工程师&a…

单片机-LED介绍

简介 LED 即发光二极管。它具有单向导电性&#xff0c;通过 5mA 左右电流即可发光 电流 越大&#xff0c;其亮度越强&#xff0c;但若电流过大&#xff0c;会烧毁二极管&#xff0c;一般我们控制在 3 mA-20mA 之间&#xff0c;通常我们会在 LED 管脚上串联一个电阻&#xff0c…

汇编语言Nasmide编辑软件

用来编写汇编语言源程序&#xff0c;Windows 记事本并不是一个好工具。同时&#xff0c;在命令行编译源程序也令很多人迷糊。毕竟&#xff0c;很多年轻的朋友都是用着 Windows 成长起来的&#xff0c;他们缺少在 DOS和 UNIX 下工作的经历。 我一直想找一个自己中意的汇编语言编…

文件导入之Validation校验List对象数组

背景&#xff1a; 我们的接口是一个List对象&#xff0c;对象里面的数据基本都有一些基础数据校验的注解&#xff0c;我们怎么样才能校验这些基础规则呢&#xff1f; 我们在导入excel文件进行数据录入的时候&#xff0c;数据录入也有基础的校验规则&#xff0c;这个时候我们又…

PaddleOCR学习笔记1-初步尝试

尝试使用PaddleOCR方法&#xff0c;如何使用自定义的模型方法&#xff0c;参数怎么配置&#xff0c;图片识别尝试简单提高识别率方法。 目前仅仅只是初步学习下如何使用PaddleOCR的方法。 一&#xff0c;测试识别图片&#xff1a; 1.png : 正确文本内容为“哲学可以帮助辩别现…