目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、JavaScript算法源码
- 六、效果展示
- 1、输入
- 2、输出
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
现有一个机器人,可放置于 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个数字,表示最大活动区域对应的网格点数目
行末无多余空格
四、解题思路
- 读取输入的网格行数 M 和列数 N;
- 创建一个二维数组 region,用于表示网格;
- 读取输入的网格数值,并将其存储到 region 数组中;
- 初始化最大活动区域对应的网格点数目 max 为 0;
- 遍历网格中的每个网格点,以每个网格点为起点进行深度优先搜索;
- 在深度优先搜索过程中,判断当前网格点的数值是否有效:
- 如果当前网格点的数值为 -1,表示该网格点已经访问过,直接返回 0;
- 如果当前网格点的数值与起点网格点的数值的差的绝对值大于 1,表示不满足相邻网格差值的要求,直接返回 0;
- 将当前网格点的数值设为 -1,表示已经访问过该网格点;
- 递归调用深度优先搜索函数,分别向上、下、左、右四个方向移动,并将每次递归返回的结果累加到 count 变量中;
- 返回最终的 count 值;
- 更新最大活动区域对应的网格点数目 max,取当前网格点的 count 值与 max 的较大值;
- 输出最大活动区域对应的网格点数目 max;
五、JavaScript算法源码
let region;
let M;
let N;
function calculateMaxRegion(m, n, grid) {
M = m;
N = n;
region = [];
for (let i = 0; i < M; i++) {
region[i] = [];
for (let j = 0; j < N; j++) {
region[i][j] = grid[i][j];
}
}
let max = 0;
for (let i = 0; i < M; i++) {
for (let j = 0; j < N; j++) {
if (region[i][j] !== -1) {
max = Math.max(max, move(i, j, region[i][j]));
}
}
}
return max;
}
function move(row, col, num) {
if (row < 0 || col < 0 || row >= M || col >= N) {
return 0;
}
const currentNum = region[row][col];
if (currentNum === -1 || Math.abs(currentNum - num) > 1) {
return 0;
}
region[row][col] = -1;
let count = 1;
count += move(row - 1, col, currentNum);
count += move(row + 1, col, currentNum);
count += move(row, col - 1, currentNum);
count += move(row, col + 1, currentNum);
return count;
}
六、效果展示
1、输入
2 3
1 3 5
4 1 3
2、输出
1
🏆下一篇:华为OD机试真题 JavaScript 实现【贪心的商人】【2023Q1 100分】
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。