用DFS遍历网格,标记已访问的陆地,统计独立岛屿的数量:遇到未访问的陆地时,计数加 1,并通过 DFS 将其连通的所有陆地标记为水,避免重复统计。

class Solution {
public:
    void dfs(vector<vector<char>>& grid, int r, int c) {
        int f = grid.size();    
        int m = grid[0].size(); 

        grid[r][c] = '0'; // 标记当前陆地为已访问
        // 向上
        if (r - 1 >= 0 && grid[r-1][c] == '1') dfs(grid, r - 1, c);
        // 向下
        if (r + 1 < f && grid[r+1][c] == '1') dfs(grid, r + 1, c);
        // 向左
        if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1);
        // 向右
        if (c + 1 < m && grid[r][c+1] == '1') dfs(grid, r, c + 1);
    }

    int numIslands(vector<vector<char>>& grid) {
        int f = grid.size();
        if (!f) return 0; // 网格为空,直接返回0
        int m = grid[0].size();

        int lands = 0; 
        // 遍历网格的每个单元格
        for (int r = 0; r < f; ++r) {
            for (int c = 0; c < m; ++c) {
                if (grid[r][c] == '1') { // 发现未访问的陆地
                    ++lands;
                    dfs(grid, r, c); // 标记其连通陆地
                }
            }
        }
        return lands;
    }
};