题目
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:
11110
11010
11000
00000
输出: 1
示例 2:
输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。
解题思路
- 思路就是广度搜索,大概的代码思路都看得懂;
- 主要是置0这一点要注意。置零相当于visited,就是已经访问过的点就置零。注意一定要在push的时候就置零,在pop的时候再置零是错误的。因为一个点pop出来后,会从这个点的四个方向找1,再放进队列,这样子在某种情况下会造成死循环,因为有可能一个点多次放进队列中。
代码
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
if(!grid.size()) return 0;
queue<pair<int,int>> bfs;
int count=0;
for(int i=0; i<grid.size(); i++){
for(int j=0; j<grid[0].size(); j++){
if(grid[i][j]=='1'){
count++;
bfs.push({i,j});
grid[i][j]='0';
while(!bfs.empty()){
pair<int,int> pairIndex=bfs.front();
bfs.pop();
int row=pairIndex.first, col=pairIndex.second;
if(row!=0 && grid[row-1][col]=='1'){
bfs.push({row-1,col});
grid[row-1][col]='0';
}
if(col!=0 && grid[row][col-1]=='1'){
bfs.push({row,col-1});
grid[row][col-1]='0';
}
if(row<grid.size()-1 && grid[row+1][col]=='1'){
bfs.push({row+1,col});
grid[row+1][col]='0';
}
if(col<grid[0].size()-1 && grid[row][col+1]=='1'){
bfs.push({row,col+1});
grid[row][col+1]='0';
}
}
}
}
}
return count;
}
};