给你一个由 ‘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即可,所以每次找到1我们就可以把上下左右的1都添加到待处理节点中,然后把他们置为0,对于待处理节点继续相同操作。

这样每次找到1就可以把同岛屿的1都置为0,之后再找其他岛屿的1即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public:
vector<vector<int>> d{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
int numIslands(vector<vector<char>> &grid) {
int row = grid.size();
int col = grid[0].size();
int ans = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (grid[i][j] == '1') {
ans++;
pair<int, int> start = {i, j};
stack<pair<int, int>> s;
s.push(start);
while (!s.empty()) {
pair<int, int> cur = s.top();
s.pop();
grid[cur.first][cur.second] = '0';
for (int i = 0; i < 4; i++) {
int x = cur.first + d[i][0];
int y = cur.second + d[i][1];
if (x >= 0 && x < row && y >= 0 && y < col)
if (grid[x][y] == '1') {
s.push({x, y});
}
}
}
}
}
}
return ans;
}
};