Flood Fill
算法思路:顾名思义,洪水覆盖算法,任选一个合法的格子,从这个格子开始向其他合法的格子覆盖。
可以在线性时间复杂度内,可以找到,所有连通块。
AcWing 1097. 池塘计数
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int , int> PII;
const int N = 1010;
char g[N][N];
bool st[N][N];
int n , m;
int dx[8] = {-1 , -1 , -1 , 0 , 0 , 1 , 1 , 1} , dy[8] = {-1 , 0 , 1 , -1 , 1 , -1 , 0 , 1};
void bfs(int sx , int sy)
{
queue<PII> q;
q.push({sx , sy});
while(q.size())
{
auto t = q.front();
q.pop();
int a = t.first , b = t.second;
for(int i = 0 ; i < 8 ; i++)
{
int x = a + dx[i] , y = b + dy[i];
if(x && x <= n && y && y <= m && !st[x][y] && g[x][y] == 'W')
{
q.push({x , y});
st[x][y] = true;
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
cin >> g[i][j];
int res = 0;
for(int i = 1 ; i <= n ; i++)
for(int j = 1 ; j <= m ; j++)
{
if(g[i][j] == 'W' && !st[i][j])
{
res++;
bfs(i , j);
}
}
cout << res << endl;
return 0;
}