题目链接:点击这里
学到两个小技巧:
- 使用宏定义简化代码。
- 某点的八连通,可以转换为遍历该点周围 的矩阵。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define r first // 简化代码
#define c second
using namespace std;
typedef pair<int,int> PII;
const int N = 1010, M = N * N;
int n, m;
char g[N][N];
bool st[N][N];
PII q[M];
void bfs(int x, int y)
{
int hh = 0, tt = -1;
q[++tt] = {x, y};
st[x][y] = true;
while(hh <= tt)
{
PII t = q[hh++];
for(int i = t.r - 1; i <= t.r + 1; ++i) // 遍历8个方向,即遍历3*3的矩阵
{
for(int j = t.c - 1; j <= t.c + 1; ++j)
{
if(i == t.r && j == t.c) continue;
if(i < 0 || i >= n || j < 0 || j >= m) continue;
if(g[i][j] == '.' || st[i][j]) continue;
q[++tt] = {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 cnt = 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);
cnt++;
}
}
}
printf("%d\n", cnt);
return 0;
}