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

思路:dfs

每遇到一块陆地,就增加一个岛屿计数,然后遍历该岛屿,把岛屿变成海洋,就能确保下次不选中相同岛屿上的陆地。