力扣题解-200. 岛屿数量(深度优先搜索)

题目:200. 岛屿数量

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

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

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

示例 1:

输入:
[
[‘1’,‘1’,‘1’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘0’,‘0’]
]
输出: 1

示例 2:
输入:
[
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘1’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘1’,‘1’]
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/queue-stack/kbcqv/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题解:深度优先搜索

上篇文章力扣题解-200. 岛屿数量(广度优先搜索)介绍了采用广度优先搜索的方式找出二维网格中的岛屿数量。

同样采用深度优先搜索的方式也可以解决这个问题。不管采用广度优先还是深度优先,基本搜索原则还是:当我们遍历搜索二维网格,一旦发现当前顶点属于陆地时,就发现新岛屿,岛屿的数量将会加一,并且将该陆地顶点作为探索当前岛屿的全部陆地的搜索起点。

采用深度优先搜索的方式去探索当前岛屿的全部陆地。
深度优先搜索会沿着当前陆地相邻的某个顶点(即相连的水平和垂直方向的四个顶点)进行递归地搜索下去,直到无法找出陆地为止,然后再回溯到当前陆地顶点继续探索其他相邻的顶点,重复地进行上述搜索过程,直至无法搜索到新的陆地时搜索结束,则岛屿的全部陆地探索完毕。

同时,只要还有二维网格中的顶点未被搜索,则继续进行上述的深度优先搜索过程,直至全部顶点都被探索。

之前在广度优先搜索过程中使用额外的变量visited来保存二维网格中顶点的搜索状态,这里我们可以直接对grid网格进行修改来表示顶点的搜索状态。

为简便,直接将已完成搜索的顶点标为’0’(水)。这样我们在探索新岛屿时,之前岛屿发现的岛屿都已经被标记为水了。

代码实现

class Solution {
public:
    int numIslands(vector>& grid) {
        if (!grid.size()) {
            return 0;
        }
        int ans = 0;
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[i].size(); j++) {
                if (grid[i][j] == '1') {
                    ans += 1;
                    dfs(grid, i, j);
                }
            }
        }
        return ans;
    }
private:
    void dfs(vector> & grid, int i, int j) {
        grid[i][j] = '0';
        if (i - 1 >= 0 and grid[i - 1][j] == '1') {
            dfs(grid, i - 1, j);
        }
        if (i + 1 < grid.size() and grid[i + 1][j] == '1') {
            dfs(grid, i + 1, j);
        }
        if (j - 1 >= 0 and grid[i][j - 1] == '1') {
            dfs(grid, i, j - 1);
        }
        if (j + 1 < grid[0].size() and grid[i][j + 1] == '1') {
            dfs(grid, i, j + 1);
        }
    }
};

你可能感兴趣的:(LeetCode,dfs,leetcode,算法)