用DFS解决【200.岛屿数量】

声明:小白总结,本意是记录自己的思路,不过希望能帮助别人,那就更好啦,若发现问题,欢迎指正,感谢!!
来源:力扣(LeetCode)
链接:200.岛屿数量

题目

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

输入:
11110
11010
11000
00000
输出: 1

输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

分析

关于这类问题,类比之前写过的题解13.机器人的运动范围,可以尝试用DFS解决,当然还有许多好的解法,但我太小白了,先记录一下DFS的写法吧~
首先,这道题要求的是岛屿的数量,我们可以知道,‘1’代表陆地,凡是连续到达的‘1’都归为一个岛屿,我们要求有多少不连续的部分,在机器人问题中,我们求的是能到达的范围,换到这里也就是求能连续到达的‘1’的个数。
对于这个问题,我想,要是能写一个函数,把一个坐标所能到达的位置的值都变为‘0’就好啦,这样,既可以避免重复,又可以将‘0’的位置全部排出。
每一次这样的深度搜索,我们可以看做是一个岛屿,因为每次搜索都把连续的搜索完了,当开始下一轮的时候,也就代表又是一个新的岛屿了。哈哈,耶---------

让我们一起来用代码实现吧---------

代码

// java
class Solution {
    int count = 0;//记录岛屿数量
    public int numIslands(char[][] grid) {
        if(grid == null || grid.length == 0){//先排除网格为空的特殊情况
            return 0;
        }
        int m = grid.length;//得到网格的宽度
        int n = grid[0].length;//得到网格的长度
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){//遍历每个网格
                if(grid[i][j] == '1'){//没访问过,且是陆地
                    count++;//出现一个新岛屿
                    dfs(i, j, grid);//搜索它——————
                }
            }
        }
        return count;//返回岛屿数量
    }
    private void dfs(int i, int j, char[][] grid){//实现搜索
        int m = grid.length;//同上
        int n = grid[0].length;
        //访问坐标在网格内,并且是陆地,也没有访问过
        if(i < m && i >= 0 && j < n && j >= 0 && grid[i][j] == '1'){
            grid[i][j] = '0';//访问这个位置,把它变成水吧
            dfs(i, j + 1, grid);//搜搜右边
            dfs(i, j - 1, grid);//搜搜左边
            dfs(i + 1, j, grid);//搜搜下边
            dfs(i - 1, j, grid);//搜搜上边
        }
    }
}

感谢各位巨巨们的帮助,希望在记录分析题目的条件下算法能有所提升……
用DFS解决【200.岛屿数量】_第1张图片

你可能感兴趣的:(DFS深度优先搜索)