机器人活动区域 - 华为OD统一考试

OD统一考试

题解: Java / Python / C++

alt

题目描述

现有一个机器人,可放置于 M x N 的网格中任意位置,每个网格包含一个非负整数编号,当相邻网格的数字编号差值的绝对值小于等于 1 时机器人可以在网格间移动。

问题: 求机器人可活动的最大范围对应的网格点数目

说明:

网格左上角坐标为(0,0),右下角坐标为(m - 1,n - 1)机器人只能在相邻网格间上下左右移动。

输入描述

第 1 行入为 M 和N, M 表示网格的行数 N表示网格的列数

之后 M 行表示网格数值,每行 N 个数值 (数值大小用 k 表示)数值间用单个空格分隔,行首行尾无多余空格。

M、N、k 均为整数

1<= M,N <=150

0 <= k <= 50

输出描述

输出 1行,包含 1个数字,表示最大活动区域的网格点数目, 行首行尾无多余空格。

示例1

输入:
4 4
1 2 5 2
2 4 4 5
3 5 7 1
4 6 2 4

输出
6

题解

这是一个深度优先搜索(DFS)的问题,通过遍历网格中的每个点,使用DFS计算以该点为起点的可活动最大范围。在DFS过程中,通过标记访问数组 vis 来避免重复计数。

解题思路:

  1. 从网格的每一个点出发,进行DFS,计算以该点为起点的可活动最大范围。
  2. 使用DFS时,遍历当前点的四个方向,如果相邻网格的数字编号差值的绝对值小于等于1,并且相邻网格没有被访问过,则可以继续DFS。
  3. 使用一个二维数组 vis 来标记已经访问的网格,防止重复计数。
  4. 遍历所有点,找到最大的可活动范围。

时间复杂度:O(M * N),其中 M 为网格的行数,N 为网格的列数。

空间复杂度:O(M * N),需要额外的二维数组 vis 来标记访问状态。

Java

import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    static int m, n;
    static int[][] g;
    static boolean[][] vis;
    static int[] dirs = {-1, 0, 1, 0, -1};

    public static int dfs(int r, int c) {
        if (vis[r][c]) {
            return 0;
        }

        vis[r][c] = true;
        int cnt = 1;

        // 向(r,c)的四个方向拓展
        for (int i = 0; i < 4; ++i) {
            int nr = r + dirs[i];
            int nc = c + dirs[i + 1];

            if (nr >= 0 && nr < m && nc >= 0 && nc < n && !vis[nr][nc] && Math.abs(g[nr][nc] - g[r][c]) <= 1) {
                cnt += dfs(nr, nc);
            }
        }

        return cnt;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        m = s

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024华为OD机试真题题解 文章被收录于专栏

华为OD机考(C卷、D卷)算法题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。 从 2024年4月24开始,考的都是华为OD统一考试(D卷),据已经参加D卷考试的同学反馈D卷和C卷是一样的,如果发现新题会及时更新。

全部评论
可以用并查集解决,可以相互移动的点进行连接,记录每个连接区域的size,最后遍历size数组,得到最大值
点赞
送花
回复
分享
发布于 04-25 11:11 浙江

相关推荐

点赞 评论 收藏
转发
3 3 评论
分享
牛客网
牛客企业服务