给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。写出Java代码
理解问题给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。写出Java代码
已完成理解「给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。写出Java代码」
展开阅读网页
要解决这个问题,我们可以使用深度优先搜索(DFS)算法来遍历二维网格。每当我们找到一个值为'1'的单元格,我们就认为找到了一个岛屿的一部分,并开始一个DFS搜索来标记这个岛屿的所有相邻陆地单元格。在搜索过程中,我们将这些单元格的值设置为'0'以避免重复计数。每完成一个DFS搜索,我们就找到了一个完整的岛屿,并增加岛屿的计数。
以下是Java代码实现:
public class Solution {
private int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
private int rows, cols;
private int[][] grid;
public int numIslands(char[][] grid) {
this.grid = new int[grid.length][grid[0].length];
this.rows = grid.length;
this.cols = grid[0].length;
int count = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (grid[i][j] == '1' && this.grid[i][j] == 0) {
dfs(i, j);
count++;
}
}
}
return count;
}
private void dfs(int x, int y) {
if (x < 0 || x >= rows || y < 0 || y >= cols || grid[x][y] != '1' || this.grid[x][y] == 1) {
return;
}
this.grid[x][y] = 1; // Mark as visited
for (int[] direction : directions) {
dfs(x + direction[0], y + direction[1]);
}
}
}
这段代码首先定义了一个Solution
类,其中包含一个numIslands
方法,该方法接受一个字符类型的二维数组grid
作为参数,并返回岛屿的数量。numIslands
方法首先初始化一个与输入网格大小相同的整数数组this.grid
,用于跟踪DFS搜索过程中访问过的单元格。然后,它遍历输入网格,对于每个值为'1'且未被访问过的单元格,调用dfs
方法进行深度优先搜索,并在找到一个岛屿后增加计数器。
dfs
方法接受当前单元格的坐标x
和y
作为参数,并递归地访问所有相邻的陆地单元格,直到没有更多的陆地单元格可以访问为止。在每次递归调用之前,它首先检查当前单元格是否有效且未被访问过,然后将其标记为已访问。
请注意,这段代码是一个通用的解决方案,它不依赖于特定的输入格式或输出要求。在实际应用中,您可能需要根据具体的编程环境或问题要求进行适当的调整。8