AcWing 1097. 池塘计数
原题链接
简单
作者:
总有刁民想害朕
,
2020-04-25 16:53:30
,
所有人可见
,
阅读 496
思路分析
一:实质就是利用bfs染色
二:代码框架:
1:遍历整个地图,如果有没被染过色同时满足题意的就是一个联通块
2:bfs 周围相连的点全部染上色
C++ 代码
#include <bits/stdc++.h>
using namespace std;
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({x, y});
st[x][y] = true;
while(q.size()){
auto t = q.front(); q.pop();
for(int i = t.first-1;i <= t.first+1;++i)
for(int j = t.second-1;j <= t.second+1;++j){
if(i == t.first && j == t.second) continue;
if(g[i][j] == '.' || st[i][j] || i < 0 || i >= n || j < 0 || j >= m) continue;
st[i][j] = true;
q.push({i, j});
}
}
}
int main(){
cin >> n >> m;
for(int i = 0;i < n;++i) cin >> g[i];
int ans = 0;
for(int i = 0;i < n;++i)
for(int j = 0;j < m;++j)
if(!st[i][j] && g[i][j] == 'W'){
bfs(i,j);
++ans;
}
cout << ans << endl;
return 0;
}