一、题目描述
现有一个机器人,可放置于 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个数字,表示最大活动区域对应的网格点数目
行末无多余空格
四、Java算法源码
public static int[][] region;
public static int M;
public static int N;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
M = sc.nextInt();
N = sc.nextInt();
region = new int[M][N];
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
region[i][j] = sc.nextInt();
}
}
int max = 0;
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (region[i][j] != -1) {
max = Math.max(max, move(i, j, region[i][j]));
}
}
}
System.out.println(max);
}
public static int move(int row, int col, int num) {
if (row < 0 ||col < 0 ||row >= M ||col >= N) {
return 0;
}
int currentNum = region[row][col];
if (currentNum == -1 || Math.abs(currentNum - num) > 1) {
return 0;
}
region[row][col] = -1;
int 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
3、说明
🏆下一篇:华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。