给你一个由 ‘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);
}
}
};