华为OD机试真题 Java 实现【战场索敌】【2023 B卷 100分】,深度优先搜索dfs算法,这眼花缭乱的,你这是“战场索鬼”吧?

news2025/2/5 12:00:41

在这里插入图片描述

目录

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

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

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

  • 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。

在这里插入图片描述

一、题目描述

有一个大小是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’,敌军数量+1
        if (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’,敌军数量+1
                    if (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 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

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

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

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

相关文章

从零开始 Spring Cloud 4:Nacos

从零开始 Spring Cloud 4&#xff1a;Nacos 图源&#xff1a;laiketui.com Nacos 是 Alibaba 研发的用于 Spring Cloud Alibaba 的服务注册中心组件&#xff0c;符合 Spring Cloud 官方标准&#xff0c;同样被 Spring Cloud 官方接纳&#xff0c;所以我们可以在 Spring Cloud …

FPGA XDMA 中断模式实现 PCIE3.0 测速试验 提供工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xf…

同步和异步的区别

同步&#xff0c;可以理解为在执行完一个函数或方法之后&#xff0c;一直等待系统返回值或消息&#xff0c;这时程序是处于阻塞的&#xff0c;只有接收到返回的值或消息后才往下执行其他的命令&#xff1b; 异步&#xff0c;执行完函数或方法后&#xff0c;不必阻塞性地等待返回…

缓存服务使用总结

1、介绍 分布式缓存方案缓存服务搭建 2、分布式缓存方案&#xff08;重点掌握&#xff09; 2.1、什么是缓存 通常将数据从数据库中同步一份到内存中&#xff0c;客户端直接从内存中查询数据&#xff0c;减少了和数据库的交互次数&#xff0c;提高查询性能&#xff08;因为内…

什么是 WebSocket?Java 中如何实现 WebSocket?

什么是 WebSocket&#xff1f;Java 中如何实现 WebSocket&#xff1f; WebSocket 简介 WebSocket 是一种新型的网络协议&#xff0c;它允许客户端和服务器之间进行双向通信&#xff0c;可以实现实时数据交互。WebSocket 协议是基于 HTTP 协议的&#xff0c;使用标准的 TCP 连…

java项目之(超市管理系统ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的超市管理系统。技术交流和部署相关看文章末尾&#xff01; 目录 开发环境&#xff1a; 后端&#xff1a; 前端&#xff1a; 数据库&…

【MySQL系列】深入学习数据类型

「前言」文章内容大致是数据库的数据类型。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、数据类型分类二、数值类型2.1 tinyint类型2.2 bit类型2.3 小数类型2.3.1 float类型2.3.2 decimal类型 2.4 字符串类型2.4.1 char类型2.4.2 varchar类型2.4.3 …

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测技术应用

能源是国民经济发展和人民生活必须的重要物质基础。在过去的200多年里&#xff0c;建立在煤炭、石油、天然气等化石燃料基础上的能源体系极大的推动了人类社会的发展。但是人类在使用化石燃料的同时&#xff0c;也带来了严重的环境污染和生态系统破坏。近年来&#xff0c;世界各…

如何快速又高质量的输出PDF实验报告?

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 PDF文档的打印在很多应用场景中都会被使用到&#xff0c;最为常见的就是实验室信息管理…

rockchip linux Vendor storage 及SN添加

前言 在产品开发过程中,最后都会为产品编辑一个产品编号方便于管理和维护,而SN(Series Number)就是用于产品的生产编号。但是在linux中,并没有专门管理串码的驱动。 Vendor storage 是rockchip 被设计用来存储 SN,MAC,LAN,BT 等 vendor data。特征如下: 唯一的访问…

一些有意思的SCI

Gardner J K, Knopoff L. Is the sequence of earthquakes in Southern California, with aftershocks removed, Poissonian?[J]. Bulletin of the seismological society of America, 1974, 64(5): 1363-1367. [原文] 该论文的abstract只有一个单词&#xff1a;Yes。 目前该论…

MySQL索引使用原则,什么是覆盖索引、索引下堆、离散度……这些概念你弄明白了吗

文章目录 一、索引失效的场景二、列的离散度三、联合索引最左匹配1、什么时候用联合索引2、什么是覆盖索引 四、索引条件下推&#xff08;ICP&#xff09; 一、索引失效的场景 MySQL索引失效的场景&#xff0c;什么情况下会造成MySQL索引失效 二、列的离散度 什么是列的离散…

【Nacos】实战之配置中心加载多个配置文件

目录 复习未拆分前的yaml文件拆分配置文件dataSource.yamlmybatis.yamlother.yaml 微服务同时加载多个远程配置文件修改配置文件 复习 导入依赖在子模块里面创建 bootstrap.yaml 文件bootstrap.yaml 文件 添加需要的远程配置信息开始拆分以前的配置信息 未拆分前的yaml文件 拆…

服务器数据库被360后缀勒索病毒攻击怎么解决,勒索病毒解密

随着网络攻击日益猖獗&#xff0c;数据库遭遇勒索病毒的攻击已成为常见现象。而360后缀勒索病毒是一种恶意软件&#xff0c;它将加密数据库中的文件&#xff0c;并要求受害者支付赎金才能获得解密密钥。近日&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器被360后…

基于STM32CubeMX与keil采用按键外部中断方式控制LED与蜂鸣器

文章目录 前言1. 电路原理图理解1.1 LED与KEY原理图理解1.2 BEEP蜂鸣器 2. 外部中断配置阐述3. STM32CubeMX配置4. 代码编写4.1 代码编写思路4.2 重写回调函数 TIPS总结 前言 这篇文章详细记录外部中断方式控制LED的亮灭以及蜂鸣器的开关&#xff1b;本文从原理图开始到最后实…

工作日记20230714

1、报文id定义对&#xff0c;类库中和tracking中的报文长度定义一致&#xff0c;但是和一级那边的报文长度定义不一致&#xff0c;对方有可能会收到报文&#xff0c;但是发送方在发出数据后程序会自动中止。 2、结构体 如果定义结构体List的话&#xff0c;不用在()加初始值&a…

分享一下使用finalshell连接虚拟机失败的经历

今天在使用finalshell连接安装的Ubuntu的时候遇到了一点问题&#xff0c;通过root用户连接的时候一直连接失败。 然后照着网上的解决方式一个个试 一、安装oppenssh -server sudo apt-get install openssh-server 然后重启ssh sudo service ssh restart 二、设置密码 最后发…

【架构设计】谈谈防腐层的妙用

文章目录 前言一、一个简单的例子二、防腐层介绍总结 前言 最近在学习了解领域驱动模型DDD相关的内容&#xff0c;但是由于没有实际的项目支撑&#xff0c;所以大都是停留在一些理论层面。我发现这里面的一些设计思想还是非常有实用价值的&#xff0c;可以直接应用于你目前的项…

基于ssm+mybatis+mysql+jsp机票预定系统

基于ssmmybatismysqljsp机票预定系统 一、系统介绍二、功能展示1.主页2.个人中心3.用户管理(管理员)4.客机管理&#xff08;管理员&#xff09;5.航班管理&#xff08;管理员&#xff09;6.机票管理&#xff08;管理员&#xff09; 三、其它系统四、获取源码 一、系统介绍 系统…

nacos设置服务权重

nacos设置服务权重