问题描述
现有一个机器人,可放置于M×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个数字,表示最大活动区域的网格点数目行首行尾无多余空格
示例一
输入
4 4
1 2 5 2
2 4 4 5
3 5 7 1
4 6 2 4
输出
6
示例二
输入
2 3
1 3 5
4 1 3
输出
1
个人解法
通过率100%
import java.io.*;
import java.util.LinkedList;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strings = br.readLine().split(" ");
int row = Integer.parseInt(strings[0]), col = Integer.parseInt(strings[1]), max = 0;
int[][] nums = new int[row][col];
for (int i = 0; i < row; i++) {
String[] split = br.readLine().split(" ");
for (int j = 0; j < col; j++) {
nums[i][j] = Integer.parseInt(split[j]);
}
}
boolean[][] status = new boolean[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (!status[i][j]) {
LinkedList<int[]> q = new LinkedList<>();
q.offer(new int[]{i, j, nums[i][j]});
int sum = 1;
status[i][j] = true;
while (!q.isEmpty()) {
int[] temp = q.poll();
int x = temp[0], y = temp[1], pre = temp[2];
sum = getSum(row, col, nums, status, q, sum, x - 1, y, pre);
sum = getSum(row, col, nums, status, q, sum, x + 1, y, pre);
sum = getSum(row, col, nums, status, q, sum, x, y - 1, pre);
sum = getSum(row, col, nums, status, q, sum, x, y + 1, pre);
}
max = Math.max(max, sum);
}
}
}
System.out.println(max);
}
private static int getSum(int row, int col, int[][] nums, boolean[][] status, LinkedList<int[]> q, int sum, int x, int y, int pre) {
if (x >= 0 && x < row && y >= 0 && y < col && !status[x][y] && Math.abs(nums[x][y] - pre) <= 1) {
q.offer(new int[]{x, y, nums[x][y]});
sum++;
status[x][y] = true;
}
return sum;
}
}