【$bfs$求格点图连通块】 $Lake Counting$
传送门
题意
\(n\times m\) 的土地,每个点上包含雨水的画是\(W\),\(.\)表示不含雨水,每个点周围的\(8\)个点看作连通的,
其中所有连通的构成一个池塘,求出一共有几个池塘
数据范围
\(1\leq n\leq 1000\)
\(1\leq m \leq 1000\)
题解
总共的格点数共有\(10^{3} \times 10^{3} = 10^{6}\)个,\(dfs\)会爆栈,从任意的\(W\)点开始,\(bfs\) 这个\(W\)连通块所有的并标记,进行的\(bfs\) 次数即池塘的数量
时间复杂度:\(O(8\times N \times M) = O(N\times M)\)
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
const int N=1010;
char g[N][N];
bool st[N][N];
int n,m;
void bfs(int x,int y)
{
queue<pair<int,int>>q;
q.push(make_pair(x,y));
while(q.size())
{
pair<int,int>t=q.front();
q.pop();
int tx=t.first,ty=t.second;
rep(i,tx-1,tx+1) rep(j,ty-1,ty+1)
{
if(i==tx&&j==ty) continue;
if(i>0 && i<=n && j>0 && j<=m)
{
if(g[i][j]=='.') continue;
if(st[i][j]) continue;
st[i][j]=1;
q.push(make_pair(i,j));
}
}
}
}
int main()
{
cin>>n>>m;
rep(i,1,n) cin>>g[i]+1;
int ans=0;
rep(i,1,n) rep(j,1,m)
{
if(g[i][j]=='W' && !st[i][j])
bfs(i,j),++ans;
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号