#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=105;
char map[N][N];
struct AA{
int x,y;
AA(int xx=-1,int yy=-1):x(xx),y(yy){}
inline bool operator==(AA a){
return a.x==x&&a.y==y;
}
AA(const AA& a):x(a.x),y(a.y){}
inline bool operator!=(AA a){
return !(a.x==x&&a.y==y);
}
};
AA set[N][N];
AA set_find(AA a){
if(set[a.x][a.y]==AA(-1,-1))return a;
return set[a.x][a.y]=set_find(set[a.x][a.y]);
}
void dfs(int x,int y,AA a){
if(set_find(AA(x,y))!=set_find(a)||map[x][y]=='G'){
if(map[x][y]=='#'){
set[x][y].x=a.x;
set[x][y].y=a.y;
map[x][y]='G';
}
int xx,yy;
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
if(map[xx=x+i][yy=y+j]=='#'){
dfs(x+i,y+j,a);
}
}
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m),n&&m){
getchar();
memset(set,-1,sizeof(set));
for(int i=0;i<n;i++)
gets(map[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(map[i][j]=='#'){
map[i][j]='G';
dfs(i,j,AA(i,j));
}
int cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(map[i][j]=='G'){
if(set_find(AA(i,j))==AA(i,j))
cnt++;
}
printf("%d\n",cnt);
}
}
2018_2_12_并查集二维
最新推荐文章于 2022-10-30 17:45:32 发布