

2 2 DK HF 3 3 ADC FJK IHE -1 -1
2 3
#include<stdio.h>
#include<string.h>
int arr[12][4]={{0,0,0,0},{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},
{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}};
int p[55][55];
int root[2550];
int find(int i){
if(root[i]==i) return i;
return root[i]=find(root[i]);
}
void unio(int x,int y){
if(find(x)<=find(y)) root[y]=find(x);
else root[x]=find(y);
}
int main(){
int n,m;
while(~scanf("%d%d",&n,&m),n>0&&m>0){
memset(p,0,sizeof(p));
int i,j,t,x,y,u,v;
char ch;
for(i=1;i<=n;++i){
for(j=1;j<=m;++j)
root[i*m+j]=i*m+j;
}
for(int i=1;i<=n;++i){
getchar(); //注意此处!!!!
for(j=1;j<=m;++j){
scanf("%c",&ch);
p[i][j]=ch-'A'+1;
}
}
for(i=1;i<=n;++i){
for(j=1;j<=m;++j){
t=p[i][j];x=p[i][j-1];y=p[i-1][j];u=p[i+1][j];v=p[i][j+1];
if(arr[t][0]&&arr[y][1]) unio(find(i*m+j),find((i-1)*m+j));
if(arr[t][1]&&arr[u][0]) unio(find(i*m+j),find((i+1)*m+j));
if(arr[t][2]&&arr[x][3]) unio(find(i*m+j),find(i*m+j-1));
if(arr[t][3]&&arr[v][2]) unio(find(i*m+j),find(i*m+j+1));
}
}
int nu=0;
for(i=1;i<=n;++i){
for(j=1;j<=m;++j){
if(root[i*m+j]==i*m+j) nu++;
}
}
printf("%d\n",nu);
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj-1198-Farm Irrigation【并查集】
原文:http://blog.csdn.net/qq_18062811/article/details/47027451