最大岛屿体积_200分_A卷_dfs/回溯/递归

最大岛屿体积

题目描述:

给你一个由 大于0的数(陆地)和 0(水)组成的的二维网格,
请你计算网格中最大岛屿的体积。
陆地的数表示所在岛屿的体积。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

输入输出描述:

输入描述:

  第一行是二维网格的宽和高。
  后面几行是二维网格。

输出描述:

  输出岛屿的最大体积。

示例1:

输入:
	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

解题思路:

这道题和leetcode上的:
  200.岛屿的数量、
  463. 岛屿的周长、
  695. 岛屿的最大面积、
  827. 最大人工岛
的解题思路差不多,
在dfs过程中累计属于同一个岛屿的多个网格,统计完一个岛屿,更新一下最大岛屿的体积。
最大岛屿体积_200分_A卷_dfs/回溯/递归_第1张图片

代码:

static boolean[][] visited;
static int max = 0;
public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	String[] in = scanner.nextLine().split(" ");
	int m = Integer.parseInt(in[0]);
	int n = Integer.parseInt(in[1]);
	int[][] matrix = new int[m][n];
	visited = new boolean[m][n];

	// 处理输入
	for (int i = 0; i < m; i++) {
		String[] split = scanner.nextLine().split(" ");
		for (int j = 0; j < n; j++) {
			matrix[i][j] = Integer.parseInt(split[j]);
		}
	}

	// 访问每一个岛屿
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (!visited[i][j] && matrix[i][j] != 0) {
				dfs(matrix, i, j, matrix[i][j]);
			} else if (matrix[i][j] == 0) {
				visited[i][j] = true;
			}
		}
	}
	System.out.println(max);
}

private static void dfs(int[][] matrix, int i, int j, int sum) {
	// 被访问过了或者下标越界了
	if (i >= matrix.length || j >= matrix[0].length || visited[i][j]) {
		return;
	}

	visited[i][j] = true;
	// 向下
	if (i + 1 < matrix.length && matrix[i + 1][j] != 0) {
		sum += matrix[i + 1][j];
		dfs(matrix, i + 1, j, sum);
	}
	// 向右
	if (j + 1 < matrix[0].length && matrix[i][j + 1] != 0) {
		sum += matrix[i][j + 1];
		dfs(matrix, i, j + 1, sum);
	}
	max = Math.max(max, sum);
}

其他类似题目
无向图染色_200分_A卷_dfs/回溯
快递业务站_100分_2023A卷_并查集/dfs
发广播_200分_A/B卷复用_并查集/dfs
叠积木_200分_A/B卷复用_回溯/贪心/dfs

你可能感兴趣的:(华为OD机试真题(Java,A卷+B卷),深度优先,华为od,华为,java,算法)