0093 泛洪填充之岛屿问题

泛洪填充常见于岛屿问题:

  • 1254.统计封闭岛屿的数目
  • 694.不同的岛屿数
  • 200.岛屿问题

解法三种:DFS,BSF,并查集
下面以200.岛屿问题解析泛洪填充的过程,题目描述:

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入: 11110 11010 11000 00000 输出: 1 示例 2:

输入: 11000 11000 00100 00011 输出: 3 解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

问题分析:以DFS思路为例,既然是要寻找岛屿个数(可以理解为连通域的个数),那就需要扫描整个网格图。对每个网格:

  • 为 1:该位置属于某个岛屿的一部分,如果对其扩展开来搜寻连通的区域,最终会触及到边界,那么确认完一个岛屿。其中对于确认是岛屿一部分的网格(为1),需要将其“下沉”,即修改为0,不然会出现兜圈子,死循环。这样每完成一次深度遍历,我们就找到一个岛屿,岛屿次数加一
  • 为 0:说明该网格处为水域,直接跳过不进行深度遍历。
    当全部遍历完后,就能得到岛屿的个数。

以下是DFS的实现代码:

package floodFill;

public class NumberOfIslands {
    public static void main(String[] args) {
        char[][] grid = new char[][]{
                {'1', '1', '1', '1', '0'},
                {'1', '1', '0', '1', '0'},
                {'1', '1', '0', '0', '0'},
                {'0', '0', '0', '0', '0'}
        };

        System.out.println("以下是原始网格:");
        for (char[] list : grid) {
            for (char e : list) {
                System.out.print(e + " ");
            }
            System.out.println();

        }

        System.out.println("岛屿的个数为: "+numIslands(grid));

        System.out.println("岛屿“下沉”后的网格图:");
        for (char[] list : grid) {
            for (char e : list) {
                System.out.print(e + " ");
            }
            System.out.println();

        }
    }


    public static int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0)
            return 0;
        int counter = 0;
        for (int r = 0; r < grid.length; r++)
            for (int c = 0; c < grid[0].length; c++){
                if (grid[r][c] == '1') {
                    counter++;
                    dfs(grid, r, c);
                }
            }
        return counter;

    }

    private static void dfs(char[][] grid, int r, int c){
        if (r < 0 || c < 0 || r > grid.length-1 || c > grid[0].length-1
                || grid[r][c] == '0')  //bounds
            return;

        grid[r][c] = '0';  //mark '1' to '0'
        dfs(grid, r - 1, c); //up
        dfs(grid, r + 1, c);  //down
        dfs(grid, r, c - 1); //left
        dfs(grid, r, c + 1); //right
    }
}

打印结果:
0093 泛洪填充之岛屿问题_第1张图片


下面介绍广度优先算法BSF的实现思路:

TODO…

你可能感兴趣的:(Algorithm)