class Solution {
    // 深度优先搜索:往一个方向遍历,走到头就回溯,再往另外一个方向遍历
    // 广度优先搜索:从一个位置开始,向他的相邻位置搜索,逐层进行,用队列实现,需要用一个boolean数组进行标记,避免重复


     // 岛屿数量这个题是深度优先搜索和广度优先搜索的基础题
     // 深度优先代码相对简单,遍历字符数组,过程碰到'1'就进行深搜,深搜的过程只要判断是否越界,元素是否为'1',对相邻'1'进行深度优先 
    int[][] pos = {{1,0}, {-1,0},{0,1},{0,-1}};
    public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int num = 0;
        boolean[][] visited = new boolean[m][n];
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if ( grid[i][j] == '1') {
                    dfs(grid,i,j);
                    num++;
                }
            }
        }
        return num;
    }
    public void dfs(char[][] grid, int row, int col) {
        if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length || grid[row][col] == '0') {
             return;
         }
        
        grid[row][col] = '0';
        dfs(grid, row + 1, col);
        dfs(grid, row - 1, col);
        dfs(grid, row, col + 1);
        dfs(grid, row, col - 1);
    }
        
    // public void dfs (char[][] grid, int row, int col) {
    //     if (row < 0 || row >= grid.length || col < 0 || col >= grid[0].length || grid[row][col] == '0') {
    //         return;
    //     }
    //     grid[row][col] = '0';
    //     dfs(grid, row - 1, col);
    //     dfs(grid, row + 1, col);
    //     dfs(grid, row, col + 1);
    //     dfs(grid, row, col - 1);
    // }
    public void bfs(char[][] grid, int row, int col, boolean[][] visited) {
        grid[row][col] = '0';
        visited[row][col] = true;
        Queue<int[]> que = new LinkedList<>();
        que.offer(new int[]{row,col});
        while (!que.isEmpty()) {
            int[] cur = que.poll();
            int x = cur[0];
            int y = cur[1];
            for (int[] tmp : pos) {
                int curX = tmp[0] + x;
                int curY = tmp[1] + y;
                if (curX < 0 || curX >= grid.length || curY < 0 || curY >= grid[0].length || grid[curX][curY] == '0' || visited[curX][curY]) {
                    continue;
                }
                que.offer(new int[]{curX, curY});
                visited[curX][curY] = true;
            }
            
        }
    }
}