算法之路-岛屿数量

387 阅读1分钟

题目

岛屿数量

3.png

思路

1是陆地,0是海洋,如果陆地的上下左右是相连的,只算作1块陆地。循环遍历网格,发现陆地计数就+1,在遍历下一个网格之前,先把跟该网格相关联的陆地置为0(击沉)。

可以用深度优先搜索递归实现。

代码

private static int sinkingIslandNum(int[][] grid) {
    int r = grid.length;
    int c = grid[0].length;
    int num = 0;
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++) {
            //遍历每一个方格
            if (grid[i][j] == 1) {
                //发现一个陆地
                num++;
                //击沉
                dfs(grid, i, j);
            }
        }
    }
    return num;
}

private static void dfs(int[][] grid, int r, int c) {
    if (r < 0 || c < 0
            || r >= grid.length || c >= grid[0].length
            || grid[r][c] == 0) {
        return;
    }
    grid[r][c] = 0;
    //顺藤摸瓜 全部击沉
    dfs(grid, r - 1, c);
    dfs(grid, r + 1, c);
    dfs(grid, r, c - 1);
    dfs(grid, r, c + 1);
}