c++ Flood Fill
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
typedef pair<int, int> PII;
#define fi first
#define se second
int n, m;
char G[N][N];
queue<PII> q;
bool vis[N][N];
int dirs[8][2]={{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
int main(){
memset(vis, 0x00, sizeof vis);
cin>>n>>m;
for(int i=0; i<n; ++i) cin>>G[i];
function<void(int, int)> bfs = [&](int x, int y){
q.push({x, y});
vis[x][y]=true;
while(!q.empty()){
int posx=q.front().fi;
int posy=q.front().se;
q.pop();
for(int i=0; i<8; ++i){
int nx=posx+dirs[i][0];
int ny=posy+dirs[i][1];
if(0<=nx && nx<n && 0<=ny && ny<m && !vis[nx][ny] && G[nx][ny]=='W'){
vis[nx][ny]=true;
q.push({nx, ny});
}
}
}
};
int ans=0;
for(int i=0; i<n; ++i){
for(int j=0; j<m; ++j){
if(G[i][j]=='W' && !vis[i][j]) {bfs(i, j); ++ans;}
}
}
cout<<ans<<endl;
return 0;
}