题目链接 --------》池塘计数
这个题目是一个经典的连通块搜索模型
所以是个大水题
其中有一个遍历八个方向的小算法就是
for (int i = t.l - 1; i <= t.l + 1; i++)
for (int j = t.r - 1; j <= t.r + 1; j++)
{
if(i == t.l && j == t.r ) continue;
}
其他的代码可以直接上模板了
Easy to Code
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
#define l first
#define r second
using namespace std;
const int N = 1010;
typedef pair<int, int> PII;
queue<PII> q;
char g[N][N];
bool st[N][N];
int n,m;
void bfs(int x, int y)
{
q.push({x,y});
st[x][y] = true;
while( q.size() )
{
PII t = q.front();
q.pop();
for (int i = t.l - 1; i <= t.l + 1; i++)
for (int j = t.r - 1; j <= t.r + 1; j++)
{
if(i == t.l && j == t.r ) continue;
if(i < 0 || i >= n || j < 0 || j >= m ) continue;
if(st[i][j]) continue;
if(g[i][j] == '.') continue;
q.push({i,j});
st[i][j] = true;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i = 0; i < n; i++)
scanf("%s",g[i]);
int res = 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);
res++;
}
printf("%d\n",res);
return 0;
}