题目描述
给你一个由大于0的数(陆地)和0(水)组成的的二维网格,请你计算网格中最大岛屿的体积。陆地的数表示所在岛屿的体积。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入描述
第一行是二维网格的宽和高。后面几行是二维网格。
输出描述
输出岛屿的最大体积。
样例
输入
5 5
0 1 1 0 0
0 1 1 0 0
0 0 0 0 0
0 0 1 2 3
0 0 1 3 9
输出
19
dfs递归处理即可得到每个岛屿的体积,最后返回最大体积即可
package hwod;
import java.util.Scanner;
public class MaxIslandVolume {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[][] grids = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
grids[i][j] = sc.nextInt();
}
}
System.out.println(maxIslandVolume(grids));
}
private static int[] x_axis = new int[]{1, 0, -1, 0};
private static int[] y_axis = new int[]{0, 1, 0, -1};
private static int area;
private static int maxIslandVolume(int[][] grids) {
int res = Integer.MIN_VALUE;
int m = grids.length;
if (m == 0) return 0;
int n = grids[0].length;
int[] used = new int[m * n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grids[i][j] != 0 && used[i * n + j] == 0) {
area = 0;
recur(grids, i, j, used);
res = Math.max(area, res);
}
}
}
return res;
}
private static void recur(int[][] grids, int i, int j, int[] used) {
int m = grids.length, n = grids[0].length;
area += grids[i][j];
used[i * n + j] = 1;
for (int k = 0; k < 4; k++) {
int nx = i + x_axis[k];
int ny = j + y_axis[k];
if (nx >= 0 && nx < m && ny >= 0 && ny < n && used[nx * n + ny] != 1 && grids[nx][ny] != 0) {
recur(grids, nx, ny, used);
}
}
}
}
如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。