【$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;
}
posted @ 2020-10-29 23:17  Hyx'  阅读(79)  评论(0)    收藏  举报