现有一个机器人,可放置于 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个数字,表示最大活动区域对应的网格点数目
行末无多余空格
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
2 3
1 3 5
4 1 3
1
下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路
本文收录于,华为OD机试(Python)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。