最近做了,然后问了问学长做了没有,lfd是圣诞夜做的....
有点后悔,我做早了.
我也想要圣诞夜有人陪我看极光......
传送门
思路:
因为是曼哈顿距离小于2,就算在一个图中,
那么中间的点为起点的话,
那么一共有12与他相邻的点和他属于一个图案...
like this:
那么我们就可以按照这12个点与中间的(0,0)点的距离来进行BFS
代码:
//19-08-30
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define N 100010
#define M 110
using namespace std;
struct node {
int x, y;
};
int f[M][M], n, m, ans; char s[M][M];
int next[12][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1},{-2,0},{0,-2},{0,2},{2,0}};
int read() {
int s = 0, f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
return f ? -s : s;
}
void bfs(int p, int q) {
queue<node> qa;
f[p][q] = 1;
qa.push((node){p, q});
while (!qa.empty()) {
node a = qa.front(); qa.pop();
for (int i = 0; i < 12; i++) {
int x = a.x + next[i][0], y = a.y + next[i][1];
if (x < 1 && x > n && y < 1 && y > n) continue;
if (f[x][y] == 0 && s[x][y] == '#') {
f[x][y] = 1;
// ans++;
qa.push((node) {x, y});
}
}
}
}
int main() {
n = read(), m = read();
char ch;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> s[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (s[i][j] == '#' && f[i][j] == 0)
bfs(i, j), ans++;
cout << ans;
}