public class Solution {
    // 定义四个方向的变化,分别是右、下、左、上
    int[] dx = {1, 0, -1, 0};
    int[] dy = {0, 1, 0, -1};

    public int solve(char[][] grid) {
        int ans = 0;
        int n = grid.length;
        int m = grid[0].length;

        // 遍历网格
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // 如果是岛屿部分
                if (grid[i][j] == '1') {
                    dfs(grid, i, j, n, m);
                    ans++; // 每次调用 DFS 说明找到了一个岛屿
                }
            }
        }
        return ans;
    }

    // 深度优先搜索,用来将与当前岛屿相连的部分标记为已访问
    public void dfs(char[][] grid, int x, int y, int n, int m) {
        // 检查边界条件
        if (x < 0 || y < 0 || x >= n || y >= m || grid[x][y] == '0') {
            return;
        }

        // 标记当前格子为已访问
        grid[x][y] = '0';

        // 遍历四个方向
        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            dfs(grid, nx, ny, n, m); // 递归搜索
        }
    }
}