华为OD机试真题---机器人活动区域

news2024/10/3 7:17:45

华为OD机试中的“机器人活动区域”题目是一个典型的图论和搜索算法问题,要求在一个二维网格中找出满足特定条件的连续区域,并计算这些区域中最大的一个区域所包含的格子数。具体来说,这个问题要求机器人能够在网格中移动,其移动规则是相邻格子之间的数字编号差值的绝对值必须小于等于1。

题目描述

  • 输入:
    • 第一行包含两个整数M和N,分别表示网格的行数和列数。
    • 接下来的M行,每行包含N个整数,表示网格中每个格子的数字编号。
  • 输出:
    • 输出一个整数,表示机器人可活动的最大范围对应的网格点数目。

解题思路

  1. 遍历网格:从网格的左上角开始,逐个遍历每个格子。
  2. 深度优先搜索(DFS)或广度优先搜索(BFS)
    • 当遍历到一个格子时,检查其所有相邻的格子(上、下、左、右四个方向,也可以考虑对角线方向,但题目通常只要求四个基本方向)。
    • 如果相邻格子的数字编号与当前格子满足差值绝对值小于等于1的条件,则将该相邻格子加入到当前区域中,并继续对该相邻格子进行相同的搜索过程。
    • 使用一个标记数组来记录哪些格子已经被访问过,以避免重复访问。
  3. 计算区域大小:在搜索过程中,统计当前区域包含的格子数。
  4. 寻找最大区域:遍历完整个网格后,找到并输出所有区域中最大的一个区域所包含的格子数。

示例

示例1
  • 输入:
    4 4
    1 2 5 2
    2 4 4 5
    3 5 7 1
    
  • 输出:
    6
    
    解释:在这个网格中,存在一个由6个格子组成的最大区域,这些格子的数字编号满足相邻格子之间差值的绝对值小于等于1的条件。
示例2
  • 输入:
    2 3
    1 3 5
    4 1 3
    
  • 输出:
    1
    
    解释:在这个网格中,任意两个相邻格子之间的差值绝对值都大于1,因此机器人无法在不同格子之间移动,只能在单个格子内活动。

注意事项

  • 在编写代码时,要注意边界条件的处理,确保不会越界访问网格。
  • 使用标记数组来避免重复访问已经访问过的格子。
  • 在搜索过程中,要及时更新当前区域的大小,并在遍历完整个网格后找到并输出最大的区域大小。

当然,下面我将给出解决“机器人活动区域”问题的详细解题步骤,这个问题通常涉及到图的遍历算法,如深度优先搜索(DFS)或广度优先搜索(BFS)。为了简化,我们将使用DFS作为遍历方法。

解题步骤

1. 初始化
  • 输入处理:读取网格的行数M和列数N,以及网格中每个格子的数字编号。
  • 创建网格:根据输入数据,创建一个二维数组grid来存储网格,其中grid[i][j]表示第i行第j列的格子编号。
  • 创建访问标记数组:创建一个同样大小的二维布尔数组visited,用于标记网格中的格子是否已被访问过。初始时,所有格子都未被访问(即visited[i][j] = false)。
2. 深度优先搜索(DFS)
  • 定义DFS函数:该函数接受当前格子的行索引row、列索引col以及当前区域的大小size作为参数。
  • 边界检查:在尝试访问相邻格子之前,检查当前格子的行索引和列索引是否在网格范围内内(即0 <= row < M0 <= col < N)。
  • 访问标记:将当前格子标记为已访问(即visited[row][col] = true)。
  • 递归搜索:对于当前格子的每个相邻格子(上、下、左、右),如果它未被访问过(即!visited[newRow][newCol])且满足差值条件(即|grid[newRow][newCol] - grid[row][col]| <= 1),则递归调用DFS函数,并将相邻格子的行索引、列索引以及当前区域大小加1作为参数传递。
  • 更新区域大小:在DFS过程中,通过递归调用时的参数传递,不断更新当前区域的大小。
3. 遍历网格并应用DFS
  • 遍历网格中的每个格子。
  • 对于每个未访问过的格子(即!visited[i][j]),调用DFS函数,以该格子为起点开始搜索,并将初始区域大小设置为1。
  • 在每次DFS调用后,检查并更新找到的最大区域大小。
4. 输出结果
  • 遍历完整个网格后,输出找到的最大区域大小。

示例代码(Java)




public class RobotActivityArea {

    private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 上下左右

    /**
     * 计算二维网格中最大的岛屿面积
     * 岛屿由1表示,水域由0表示,岛屿的定义是水平或垂直连接的1的集合
     * 此函数通过深度优先搜索(DFS)算法来遍历每个网格,找出最大的岛屿面积
     *
     * @param grid 二维网格,由0和1组成,0代表水域,1代表岛屿的一部分
     * @return 返回最大岛屿的面积如果网格为空或没有岛屿,则返回0
     */
    public static int maxArea(int[][] grid) {
        // 检查网格是否为空或者没有岛屿,如果是,则直接返回0
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0;
        }

        // 初始化网格的行数和列数
        int rows = grid.length;
        int cols = grid[0].length;
        // 创建一个二维布尔数组,用于记录每个网格是否已经被访问过
        boolean[][] visited = new boolean[rows][cols];
        // 初始化最大岛屿面积为0
        int maxArea = 0;

        // 遍历每个网格
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                // 如果当前网格没有被访问过,则计算从这个网格出发的岛屿面积
                if (!visited[i][j]) {
                    int currentArea = dfs(grid, visited, i, j);
                    // 更新最大岛屿面积
                    maxArea = Math.max(maxArea, currentArea);
                }
            }
        }

        // 返回最大岛屿面积
        return maxArea;
    }

    /**
 * 深度优先搜索计算网格区域
 *
 * @param grid 二维网格数组,表示地图
 * @param visited 二维布尔数组,表示是否访问过
 * @param row 当前行位置
 * @param col 当前列位置
 * @return 返回从给定位置开始的网格区域大小
 */
private static int dfs(int[][] grid, boolean[][] visited, int row, int col) {
    // 检查grid和visited是否为空或null
    if (grid == null || grid.length == 0 || visited == null || visited.length == 0) {
        return 0;
    }

    // 获取网格的行数和列数
    int rows = grid.length;
    int cols = grid[0].length;

    // 检查当前位置是否越界或已被访问,如果是,则返回0
    if (row < 0 || row >= rows || col < 0 || col >= cols || visited[row][col]) {
        return 0;
    }

    // 将当前位置标记为已访问
    visited[row][col] = true;
    // 初始化区域计数为1,代表当前位置
    int area = 1;

    // 遍历四个方向(假设DIRECTIONS已定义为包含四个方向的数组:{-1, 0}, {1, 0}, {0, -1}, {0, 1})
    for (int[] direction : DIRECTIONS) {
        // 计算下一个位置的行和列
        int newRow = row + direction[0];
        int newCol = col + direction[1];
        // 如果下一个位置有效,则累加其区域
        if (isValid(grid, visited, newRow, newCol, grid[row][col])) {
            area += dfs(grid, visited, newRow, newCol);
        }
    }

    // 返回当前位置开始的区域大小
    return area;
}


    // 假设isValid方法已定义,用于检查给定位置是否为有效位置
    // 返回true如果位置有效,否则返回false
    private static boolean isValid(int[][] grid, boolean[][] visited, int row, int col, int prevValue) {
        // 检查位置是否越界和已被访问
        // 检查当前位置的值是否与前一个位置的值相同(这里假设我们只关心连续相同的值)
        // 根据实际情况可能需要更复杂的逻辑来判断有效性
        return row >= 0 && row < grid.length && col >= 0 && col < grid[0].length && !visited[row][col] && grid[row][col] == prevValue;
    }


    public static void main(String[] args) {
        int[][] grid = {
                {1, 2, 5, 2},
                {2, 4, 4, 5},
                {3, 5, 7, 1}
        };

        System.out.println("Max area: " + maxArea(grid)); 
    }
}

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

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

相关文章

openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数

文章目录 openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数概述笔记官方给出的单独启动CvPipeLineEditor的方法我自己环境单独启动CvPipeLineEditor的方法CvPipeLineEditor启动后的样子添加命令的方法删除不要的命令参数调整多个命令参数的执行顺序添加命令用来载入实验…

数据治理006-数据标准的管理

元数据的分类和标准有哪些&#xff1f; 一、元数据的分类 元数据可以根据其描述的对象和属性不同&#xff0c;被分为不同的类型。以下是几种常见的元数据分类方法&#xff1a; 基于数据的类型&#xff1a;根据数据的类型&#xff0c;元数据可以被分为结构化元数据、非结构化元…

WPF用户控件的使用

WPF用户控件的使用 先看一下程序结构&#xff1a; WPF_Test是我的主程序&#xff1b;WPF_LIB是我添加的一个用户控件库&#xff0c;其中UserControl1是一个用户控件&#xff1b; 用户控件xaml代码&#xff1a; <UserControl x:Class"WPF_LIB.UserControl1"xmln…

爵士编曲:爵士钢琴编写的规律和步骤 关于教程的个人想法 举一反三

反思了下自己目前学习编曲和其他兴趣爱好时暴露出来的问题&#xff0c;就是举一反三的能力还有待提高&#xff01;平时多学习和多对学习内容进行举一反三&#xff0c;也就是根据一个例子&#xff0c;创作出类似的3个以上的例子&#xff0c;这样才算学会&#xff0c;并且事半功倍…

2024必备英语在线翻译工具推荐

英语在线翻译工具就如同一位随时待命的语言助手&#xff0c;为我们打破语言障碍&#xff0c;搭建起沟通的桥梁。接下来&#xff0c;让我们一起深入了解这些英语在线翻译工具的丰富功能及其为我们带来的便利。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc …

【含文档】基于Springboot+微信小程序 的海产品加工销售一体化管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

基于SpringBoot+Vue+MySQL的民宿预订平台

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;民宿作为一种独特的住宿方式&#xff0c;受到了越来越多游客的青睐。然而&#xff0c;传统的民宿预定方式往往存在信息不对称、效率低下等问题&#xff0c;难以满足游客的个性化需…

python的内存管理机制

python的内存管理机制主要分为三个部分&#xff1a;引用计数、垃圾回收和内存池机制。 引用计数机制&#xff1a; python通过维护每个对象的引用计数来跟踪内存中的对象。当对象被创建时就会有一个引用计数&#xff0c;当对象不再被使用时&#xff0c;引用计数为0&#xff0c…

Android SystemUI组件(08)睡眠灭屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 睡眠灭屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来完…

【电路基础 · 2】电阻电路的等效变换(自用)

总览 1.电路的等效变换 1.1 电阻电路 1.2 等效变换是什么 1.3 线性电路和非线性电路 1.4 时变电路和非时变电路 1.5 二端网络&#xff08;一端口网络&#xff09;、四端网络&#xff08;二端口网络&#xff09;、六端网络&#xff08;三端口网络&#xff09; 1.6 两端电路的等…

每日一题:二分查找

文章目录 一、思路一&#xff1a;常规思路1、寻找固定值2、寻找左边界3、寻找右边界 二、思路二&#xff1a;红蓝法二分三、模板题1、二分查找2、在排序数组中查找元素的第一个和最后一个位置 二分查找&#xff0c;顾名思义&#xff0c;就是每次筛选能晒掉一半的数据。 二分查…

leetcode每日一题day22(24.10.2)——准时到达的列车最小度

思路&#xff1a;这种在有约束条件情况下&#xff0c;求最值或最符合要求的情况&#xff0c;首先是很容易想到&#xff0c;从时速为1开始往后找找到满足条件就输出&#xff0c;但这无疑工程量很大&#xff0c;每种可能的速度都要对列车数组进行遍历&#xff0c; 时间复杂度为C…

数据库第8章编程题2

10-1 查询选修某两门课程的学生&#xff08;MSSQL) 本题目要求编写SQL语句&#xff0c; 检索出 sc表中至少选修了’C001’与’C002’课程的学生学号。 提示&#xff1a;MSSQLServer 评测SQL语句。 表结构: 请在这里写定义表结构的SQL语句。例如&#xff1a; -- 学生选课成…

Pikachu-Cross-Site Scripting-存储型xss

存储型xss &#xff0c;随便输入点内容&#xff0c;都能保存下来&#xff1b;刷新后也不会丢失&#xff1b;输入特殊字符&#xff0c;也能原样返回&#xff1b; 查看代码&#xff0c;也可以看到输出结果直接原路返回&#xff0c;不做处理 构造payload <script>alert(1)…

深度学习:cGAN和pix2pix图像转换

cGAN和pix2pix的基础概念 cGAN cGAN是条件生成对抗网络&#xff08;Conditional Generative Adversarial Networks&#xff09;的简称。 它是一种基于基础GAN&#xff08;Generative Adversarial Networks&#xff09;架构的变体&#xff0c;通过给GAN模型引入额外的信息或条…

翔云 OCR:发票识别与验真

在数字化时代&#xff0c;高效处理大量文档和数据成为企业和个人的迫切需求。翔云 OCR 作为一款强大的光学字符识别工具&#xff0c;在发票识别及验真方面表现出色&#xff0c;为我们带来了极大的便利。 一、翔云 OCR 简介 翔云 OCR 是一款基于先进的人工智能技术开发的文字识别…

酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构

一、代码 int 酒店标识_int Convert.ToInt32(酒店标识);StringBuilder 锁号2024 new StringBuilder(8);//信息 "未知返回值&#xff1a;" bufCard_原始;GetGuestLockNoByCardDataStr_原始(酒店标识_int, bufCard_原始.ToString(), 锁号2024);StringBuilder 退…

Pie-饼图

参考文档&#xff1a;Pie - Pie_set_color - Document (pyecharts.org) 模板 from pyecharts import options as opts from pyecharts.charts import Pie from pyecharts.faker import Faker"""1-Pie() 创建Pie对象2-.add("", [list(z) for z in zi…

CSS 圆形边框与阴影

目录 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影 1. 圆角边框 1.1 正圆 1.2 圆角矩形 1.3 任意圆角 1.4 某个圆角 2. 盒子阴影 3. 文字阴影

CSS盒子模型基础知识(23个案例+代码+效果图)

目录 1.边框样式 案例&#xff1a;制作一个边框为实线的正方形 1&#xff09;代码​编辑 2&#xff09;效果 案例&#xff1a;制作一个边框为虚线的正方形 1&#xff09;代码 2&#xff09;效果 案例&#xff1a;制作一个边框为点线的正方形 1&#xff09;代码 2&#xff09;效…