#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
/*
个人感觉本解法非常好,
*/
char sign[11][5]={"1010","1001","0110","0101","1100","0011",
"1011","1110","0111","1101","1111"};
int Set[100][100];
char str[100][100];
int n, m;
int Find(int x) {
return x == Set[x/m][x%m] ? x : Set[x/m][x%m] = Find(Set[x/m][x%m]);
}
void Union(int x, int y) {
x = Find(x);
y = Find(y);
if(x != y) {
Set[x/m][x%m] = y;
}
}
void judge(int i, int j) {
if(j > 0 && sign[str[i][j]-'A'][2] == '1' && sign[str[i][j-1]-'A'][3] == '1') {
Union(i*m+j, i*m + j-1);
}
if(i > 0 && sign[str[i][j]-'A'][0] == '1' && sign[str[i-1][j]-'A'][1] == '1') {
Union(i*m+j, (i-1)*m+j);
}
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF) {
if(n < 0 && m < 0)
break;
for(int i = 0; i < n; i++) {
scanf("%s", str[i]);
for(int j = 0; j < m; j++) {
Set[i][j] = i*m+j;
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
judge(i, j);
}
}
int ans = 0;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(Set[i][j] == i*m + j)
ans++;
}
}
printf("%d\n", ans);
}
return 0;
}
hdu1198 并查集(值得复习)
最新推荐文章于 2021-01-30 21:41:01 发布