题目
给定一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
这是在刷探索的数据结构碰到的,用队列或者栈都可以解决。两者的思路是一样的。每次遍历将相连的陆地全部感染(值置'0'
),而每次的第一次感染的时候岛屿数量加一。
BFS
BFS用的是队列。
- 遍历整块大陆,横着竖着遍历都可以。
- 第一次碰到陆地的时候,就知道这是块岛屿了,所以将这块陆地放入探险队列,岛屿数量加一。
- 然后我们将这块岛屿的陆地探索完。每一次将这块陆地周围(上下左右)的陆地放入队列,然后将这块陆地标记为已探索(这里就直接置为
'0'
了)。 - 当探险队列为空时,表示这块岛屿的陆地全部被探索完了,我们继续寻找下一块陆地。
class Solution {
public:
vector<vector<char>> grid;
queue<pair<int, int>> que;
// 判断是否为合法的陆地
bool isIsland(int x, int y) {
return 0 <= x && x < grid.size()
&& 0 <= y && y < grid[0].size()
&& grid[x][y] == '1';
}
// 将陆地旁边的陆地放入探险队列
void checkAndEnqueue(int x, int y) {
if (isIsland(x - 1, y)) que.push(make_pair(x - 1,