原题链接:https://www.acwing.com/problem/content/description/1099/
- 如果这个点是池塘,并且没有被标记过。从这个点开始,进行 BFS。
- 在BFS的时候,对每个点使用判重数组进行标记。
- 每进行一次BFS,就把BFS能到达的点全部表记。
- 遍历所有的点,统计一下一共BFS了多少次。
//Flood fill 算法
#include<cstring>
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N=1010, M=N*N;
int n, m;//行数和列数
char g[N][N];
PII q[M];//队列
bool st[N][N];//判重数组
void bfs(int sx, int sy)
{
int hh=0, tt=0;
q[0]={sx, sy};
st[sx][sy]=true;
while(hh<=tt)
{
PII t=q[hh++];
for(int i=t.x-1; i<=t.x+1; i++)
for(int j=t.y-1; j<=t.y+1; j++)
{
if(i==t.x && j==t.y) continue;
if(i<0 || i>=n ||j<0 || j>=m) continue;
if(g[i][j]=='.' || st[i][j]==true) continue;
q[++tt]={i, j};
st[i][j]=true;
}
}
}
int main()
{
cin>>n>>m;
for(int i=0; i<n; i++) scanf("%s", g[i]);
int cnt=0;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(g[i][j]=='W' && !st[i][j])
{
bfs(i,j);//传递坐标
cnt++;
}
printf("%d\n", cnt);
return 0;
}