题目链接:200. 岛屿数量 - 力扣(LeetCode)
本题由于没有给出开始搜索的位置,所以每一个位置都要进行一次广度优先搜索
另外为了不修改原数组数据,需要设置一个bool类型的二维数组vis来判断某个位置是否被搜索过
class Solution {
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
typedef pair<int,int> PII;
int m=0,n=0;
vector<vector<bool>> vis;//指示数组,指示某个位置是否被搜索过
public:
int numIslands(vector<vector<char>>& grid) {
int ret=0;//岛屿数量
m=grid.size();
n=grid[0].size();
vis.resize(m);//初始化指示数组
for(int i=0;i<m;++i)//初始化指示数组
{
vis[i].resize(n);
for(int j=0;j<n;++j) vis[i][j]=false;
}
//每个位置都要进行一次广度优先搜索
for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
if(grid[i][j]=='1'&&!vis[i][j])
{
++ret;
//广度优先搜索
bfs(grid,i,j);
}
}
}
return ret;
}
//广度优先搜索
void bfs(vector<vector<char>>& grid,int i,int j)
{
queue<PII> q;
q.push({i,j});
vis[i][j]=true;
while(q.size())
{
int a=q.front().first;
int b=q.front().second;
q.pop();
for(int k=0;k<4;++k)
{
int x=a+dx[k];
int 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;
}
}
}
}
};