一.题目解析

遍历整个二维数组,看有多少单独的连通域
算法解析:floodfill算法
1.遍历整个数组,遇到一个单独的连通域就使用bfs并且标记已经遍历的位置
2.bfs时是遍历上下左右,遍历时没有改变性质就会重复遍历死循环

比较考验代码能力,就是bfs时要做什么(边遍历边改true)等,结合代码给出注释.
二.代码编写:
cpp
class Solution {
int dx[4]={0,0,-1,1};
int dy[4]={1,-1,0,0};
int vis[301][301];
int m,n;
public:
int numIslands(vector<vector<char>>& grid) {
m=grid.size(),n=grid[0].size();//边界长度,采用的是全局变量
memset(vis,false,sizeof(vis));//初始化判断数组为false
int ret=0;//记录岛屿数量
for(int i=0;i<m;i++)//遍历整个数组
{
for(int j=0;j<n;j++)
{
if(grid[i][j]=='1'&&!vis[i][j])//遇到一个未遍历的岛屿,采用bfs看看岛屿多大,并标记为true已遍历
{
ret++;//计数
bfs(grid,i,j);//bfs
}
}
}
return ret;
}
void bfs(vector<vector<char>>& grid,int i,int j)
{
queue<pair<int,int>>q;//队列来实现宽度优先遍历
q.push({i,j});//岛屿的第一个坐标入队
vis[i][j]=true;//标记已遍历
while(!q.empty())//这个岛屿的其他坐标入队
{
auto [a,b]=q.front();
q.pop();
for(int k=0;k<4;k++)//遍历四个方向
{
int x=a+dx[k],y=b+dy[k];//四个方向
if(x>=0&&x<m && y>=0&&y<n && grid[x][y]=='1'&&!vis[x][y])
//四个方向都不能越界,并且要没有遍历过,符合已知性质
{
q.push({x,y});//符合入队
vis[x][y]=true;//标记已遍历
}
}
}
}
};
我们创建的是反向数组,通过迭代就可以实现遍历四个方向.