题目
给你一个由 '1'
(陆地)和 '0'
(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
思考
采用bfs。过程为:在遍历整个图的时候,在遍历到1时,进行广度搜索遍历,搜索遍历所遇到的1全改为0;当这次广度遍历不再遍历到1时,则本次广度遍历结束,岛屿数量加一。遍历完整个图,只需要知道进行了多少广度优先遍历即可
代码
typedef pair<int,int> PII;
int dx[4] = {0,1,-1,0},dy[4] = {1,0,0,-1};
int ans = 0;
queue<PII> q;
//检查是否越界
bool check(int x,int y,int n,int m)
{
return x >= 0 && y >= 0 && x < n && y < m;
}
int numIslands(vector<vector<char>>& grid) {
int n = grid.size();
int m = grid[0].size();
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
//遍历到1,准备进行广度优先遍历
if(grid[i][j] == '1')
{
ans++;
grid[i][j] = '0';
q.push({i,j});
//进行广度优先遍历
while(!q.empty())
{
auto temp = q.front();
q.pop();
for(int k = 0;k < 4;k++)
{
int x = temp.first + dx[k];
int y = temp.second + dy[k];
if(check(x,y,n,m) && grid[x][y] == '1')
{
grid[x][y] = '0';
q.push({x,y});
}
}
}
}
}
}
return ans;
}