描述

给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
例如:
输入
[
[1,1,0,0,0],
[0,1,0,1,1],
[0,0,0,1,1],
[0,0,0,0,0],
[0,0,1,1,1]
]
对应的输出为3
(注:存储的01数据其实是字符'0','1')

示例1

输入:
[[1,1,0,0,0],[0,1,0,1,1],[0,0,0,1,1],[0,0,0,0,0],[0,0,1,1,1]]
复制
返回值:
3
复制
解题思路:
1、遍历一个二维数组比较简单,无论是用暴力遍历还是其他BFS或者DFS算法;
2、因为连着的1可以被看做一个岛屿,所以如何计算岛屿的数量是本题的难点;
3、本题使用淹没法,找到一个"1"后岛屿的数量就可以加1,同时把这个1上下左右相连的1全用0淹没掉,防止重复计算。
4、淹没的结束条件是遇到0.

class Solution {
public:
    void bfs(vector<vector<char> >& grid, int x, int y) {
        int m = grid.size();
        int n = grid[0].size();
        if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == '0') {
            return;
        }
        grid[x][y] = '0';
        bfs(grid, x, y - 1);
        bfs(grid, x, y + 1);
        bfs(grid, x - 1, y);
        bfs(grid, x + 1, y);
    }
    /**
     * 判断岛屿数量
     * @param grid char字符型vector<vector<>> 
     * @return int整型
     */
    int solve(vector<vector<char> >& grid) {
        // write code here
        int m = grid.size();
        int n = grid[0].size();
        int res = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == '1') {
                    res++;
                    bfs(grid, i, j);
                }
            }
        }
        return res;
    }
};