floodfill(洪水覆盖算法)
技巧:
在做 bfs/dfs 问题时我们通常可能会用到 偏移量 这个技巧
题目1:池塘计数
分析:
bfs是枚举到一个格子时, 把它所有能拓展到的位置都加入到队列中
dfs是枚举到一个格子时,如果它能拓展到另一个格子, 那么它直接去拓展另一个格子。
一般而言同样的一道题如果用dfs代码和bfs代码都能实现, 用dfs实现会更加简单。因为它不需要额外维护一个队列
时间复杂度: O ( n ∗ m ) O(n * m) O(n∗m)
代码区:(bfs实现)
#include<iostream>
#include<cstring>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 1010;
int n, m;
char str[N][N];
PII q[N * N];
bool st[N][N];
int res;
void bfs(int a, int b)
{
int hh = 0, tt = 0;
q[0] = {a, b};
st[a][b] = true;
while(hh <= tt)
{
auto 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 >= 1 && i <= n && j >= 1 && j <= m && !st[i][j] && str[i][j] == 'W')
{
st[i][j] = true;
q[++ tt] = {i, j};
}
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
cin >> str[i][j];
}
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
if(str[i][j] == 'W' && !st[i][j])
{
bfs(i, j);
res ++;
}
}
}
cout << res << endl;
return 0;
}