力扣 leetcode 200. 岛屿数量
问题描述
给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
提示:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 300
- grid[i][j] 的值为 '0' 或 '1'
示例
示例 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
解题思路
这题要做的就是对图进行遍历,可以用深度优先搜索(DFS),也可以用广度优先搜索(BFS)。使用 DFS 时,用 栈 保存下一个要遍历的位置;使用 BFS 时,使用 队列 保存下一个要遍历的位置。我们在遍历图时,将所有的 '1' 置为另一个符号,以避免重复遍历,统计最终我们的遍历次数即可。
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
stack<pair<int, int>> s; // DFS
int res = 0;
for(int i = 0; i < grid.size(); i++){
for(int j = 0; j < grid[0].size(); j++){
if(grid[i][j] == '1'){
res++;
s.emplace(i, j); // 插入DFS的起点
grid[i][j] = 0;
while(!s.empty()){
pair<int, int> p = s.top();
s.pop();
if(p.first < (grid.size() - 1) && grid[p.first + 1][p.second] == '1'){ // 判断下方向是否是陆地
s.emplace(p.first + 1, p.second);
grid[p.first + 1][p.second] = 0;
}
if(p.first > 0 && grid[p.first - 1][p.second] == '1'){ // 判断上方向是否是陆地
s.emplace(p.first - 1, p.second);
grid[p.first - 1][p.second] = 0;
}
if(p.second < (grid[0].size() - 1) && grid[p.first][p.second + 1] == '1'){ // 判断左方向是否是陆地
s.emplace(p.first, p.second + 1);
grid[p.first][p.second + 1] = 0;
}
if(p.second > 0 && grid[p.first][p.second - 1] == '1'){ // 判断右方向是否是陆地
s.emplace(p.first, p.second - 1);
grid[p.first][p.second - 1] = 0;
}
}
}
}
}
return res;
}
};
本文来自博客园,作者:greatestchen},转载请注明原文链接:https://www.cnblogs.com/greatestchen/p/16950186.html