华为OD机试真题 Python 实现【机器人活动区域】【2023Q1 200分】

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Python算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出

一、题目描述

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

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

说明:

1)网格左上角坐标为 (0, 0),右下角坐标为 (m-1, n-1)

2)机器人只能在相邻网格间上、下、左、右移动

示例1,输入如下网格

输出:6

说明:图中绿色区域,相邻网格差值绝对值都小于等于1,且为最大区域,对应网格点数目为6

示例 2,输入如下网格:

输出:1

二、输入描述

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

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

M、N、k均为整数,且1<=M,N<=150,0<=k<=50。

三、输出描述

输出1行,包含1个数字,表示最大活动区域对应的网格点数目

行末无多余空格

四、解题思路

  1. 读取输入的网格行数 M 和列数 N;
  2. 创建一个二维数组 region,用于表示网格;
  3. 读取输入的网格数值,并将其存储到 region 数组中;
  4. 初始化最大活动区域对应的网格点数目 max 为 0;
  5. 遍历网格中的每个网格点,以每个网格点为起点进行深度优先搜索;
  6. 在深度优先搜索过程中,判断当前网格点的数值是否有效:
    • 如果当前网格点的数值为 -1,表示该网格点已经访问过,直接返回 0;
    • 如果当前网格点的数值与起点网格点的数值的差的绝对值大于 1,表示不满足相邻网格差值的要求,直接返回 0;
  7. 将当前网格点的数值设为 -1,表示已经访问过该网格点;
  8. 递归调用深度优先搜索函数,分别向上、下、左、右四个方向移动,并将每次递归返回的结果累加到 count 变量中;
  9. 返回最终的 count 值;
  10. 更新最大活动区域对应的网格点数目 max,取当前网格点的 count 值与 max 的较大值;
  11. 输出最大活动区域对应的网格点数目 max;

五、Python算法源码

def calculate_max_region(m, n, grid):
    # 创建一个二维数组 region 来表示网格
    region = []
    for i in range(m):
        # 将输入的网格数值复制到 region 数组中
        region.append(list(grid[i]))

    # 初始化最大活动区域对应的网格点数目为 0
    max_count = 0
    # 遍历网格中的每个网格点,以每个网格点为起点进行深度优先搜索
    for i in range(m):
        for j in range(n):
            if region[i][j] != -1:
                # 调用 move 函数进行深度优先搜索,并更新最大活动区域对应的网格点数目
                max_count = max(max_count, move(i, j, region[i][j], region))

    # 返回最大活动区域对应的网格点数目
    return max_count


def move(row, col, num, region):
    # 判断当前网格点的坐标是否越界
    if row < 0 or col < 0 or row >= len(region) or col >= len(region[0]):
        return 0

    # 获取当前网格点的数值
    current_num = region[row][col]
    # 判断当前网格点的数值是否有效
    if current_num == -1 or abs(current_num - num) > 1:
        return 0

    # 将当前网格点的数值设为 -1,表示已经访问过该网格点
    region[row][col] = -1
    # 初始化网格点数目为 1,表示当前网格点是活动区域的一部分
    count = 1
    # 分别向上、下、左、右四个方向移动,并将每次递归返回的结果累加到 count 变量中
    count += move(row - 1, col, current_num, region)  # 上移
    count += move(row + 1, col, current_num, region)  # 下移
    count += move(row, col - 1, current_num, region)  # 左移
    count += move(row, col + 1, current_num, region)  # 右移

    # 返回最终的 count 值
    return count

六、效果展示

1、输入

2 3
1 3 5
4 1 3

2、输出

1

在这里插入图片描述



下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路

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

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

在这里插入图片描述

你可能感兴趣的:(python,机器人,人工智能)