复制
收藏
提问
全网

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。写出Java代码

5月前
全网
文档
学术
百科
知识库
时间不限
自动

理解问题给你一个由 '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方法接受当前单元格的坐标xy作为参数,并递归地访问所有相邻的陆地单元格,直到没有更多的陆地单元格可以访问为止。在每次递归调用之前,它首先检查当前单元格是否有效且未被访问过,然后将其标记为已访问。

请注意,这段代码是一个通用的解决方案,它不依赖于特定的输入格式或输出要求。在实际应用中,您可能需要根据具体的编程环境或问题要求进行适当的调整。8

更专业一些
转笔记
专业
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。写出Java代码
不在提醒

更专业内容正在努力生成中
知识树
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。写出Java代码
如何用Java识别二维数组中的岛屿?
Java中如何计算二维数组的连通分量?
Java实现岛屿计数算法
在线客服