给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

    岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

    此外,你可以假设该网格的四条边均被水包围。

    示例 1:

    输入:grid = [
    [“1”,”1”,”1”,”1”,”0”],
    [“1”,”1”,”0”,”1”,”0”],
    [“1”,”1”,”0”,”0”,”0”],
    [“0”,”0”,”0”,”0”,”0”]
    ]
    输出:1
    示例 2:

    输入:grid = [
    [“1”,”1”,”0”,”0”,”0”],
    [“1”,”1”,”0”,”0”,”0”],
    [“0”,”0”,”1”,”0”,”0”],
    [“0”,”0”,”0”,”1”,”1”]
    ]
    输出:3

    提示:

    m == grid.length
    n == grid[i].length
    1 <= m, n <= 300
    grid[i][j] 的值为 ‘0’ 或 ‘1’


    1. class Solution {
    2. /**
    3. dfs搜寻一次res就++,搜寻过的1就标记成2来避免重复搜寻
    4. */
    5. char[][] grid;
    6. int[] dir = new int[]{-1,0,1,0,-1};
    7. public int numIslands(char[][] grid) {
    8. this.grid = grid;
    9. int n = grid.length, m = grid[0].length;
    10. int res = 0;
    11. for(int i = 0; i < n; ++i)
    12. for(int j = 0; j < m; ++j){
    13. if(grid[i][j] == '1'){
    14. res++;
    15. dfs(i,j);
    16. }
    17. }
    18. return res;
    19. }
    20. public void dfs(int x, int y){
    21. grid[x][y] = '2';
    22. for(int i = 0; i < 4; ++i){
    23. int dx = dir[i] + x, dy = dir[i+1] + y;
    24. if(dx < 0 || dx >= grid.length
    25. || dy < 0 || dy >= grid[0].length || grid[dx][dy] == '0')
    26. continue;
    27. if(grid[dx][dy] == '2') continue;
    28. grid[dx][dy] = '2';
    29. dfs(dx,dy);
    30. }
    31. }
    32. }