小学生都能看懂的题解 | #岛屿数量#

岛屿数量

https://www.nowcoder.com/practice/0c9664d1554e466aa107d899418e814e

问题描述:

你有一张地图,上面有些地方是陆地(用1表示),有些地方是海洋(用0表示)。如果两个1相邻(上下左右),它们就属于同一个岛屿。我们需要计算这张地图上有多少个岛屿。

解决方案:

  1. 遍历地图:我们需要查看地图上的每一个格子。
  2. 找到陆地:如果看到的是1(陆地),我们就标记它,并且检查它的上下左右是否有其他的1,如果有,我们也标记它们。
  3. 计数:每当我们找到一个新的1并标记它时,我们就认为发现了一个新的岛屿,并增加岛屿的计数。

代码实现:

我们可以用一个简单的程序来实现这个过程:

public class IslandCounter {

    public int solve(char[][] grid) {
        if (grid == null || grid.length == 0 || grid[0].length == 0) {
            return 0; // 如果地图是空的,没有岛屿
        }

        int rows = grid.length; // 地图的行数
        int cols = grid[0].length; // 地图的列数
        int islands = 0; // 记录岛屿的数量

        // 遍历地图上的每一个格子
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                if (grid[row][col] == '1') {
                    markIsland(grid, row, col); // 标记这个岛屿
                    islands++; // 发现了一个新的岛屿
                }
            }
        }

        return islands; // 返回岛屿总数
    }

    // 标记一个岛屿
    private void markIsland(char[][] grid, int row, int col) {
        // 检查边界
        if (row < 0 || col < 0 || row >= grid.length || col >= grid[0].length || grid[row][col] != '1') {
            return; // 如果超出边界或者不是陆地,就退出
        }

        // 标记这个位置为已访问
        grid[row][col] = 'V';

        // 检查上下左右的位置
        markIsland(grid, row + 1, col); // 向下
        markIsland(grid, row - 1, col); // 向上
        markIsland(grid, row, col + 1); // 向右
        markIsland(grid, row, col - 1); // 向左
    }

    
}

解释:

  1. 遍历地图:我们通过两层循环来查看地图上的每一个格子。
  2. 标记岛屿:当我们看到一个1时,我们知道这是一个新的岛屿的开始,于是我们调用markIsland函数来标记这个岛屿。
  3. 增加计数:每当我们标记完一个岛屿,我们就增加岛屿的计数。
  4. 递归标记markIsland函数会递归地检查当前格子的上下左右位置,如果它们也是1,就继续标记它们。

如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。

#题解#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务