http://acm.hdu.edu.cn/showproblem.php?pid=1198
感觉写的挺吊的。。。
#include<stdio.h> #include<string.h> int U[7],D[7],R[7],L[7],num[2504],fa[2504]; char map[54][54],mapUD[100][100],mapLR[100][100]; void prepare() { int i,j; U[0]='A';U[1]='B';U[2]='E';U[3]='G';U[4]='H';U[5]='J';U[6]='K'; D[0]='C';D[1]='D';D[2]='E';D[3]='H';D[4]='I';D[5]='J';D[6]='K'; L[0]='A';L[1]='C';L[2]='F';L[3]='G';L[4]='H';L[5]='I';L[6]='K'; R[0]='B';R[1]='D';R[2]='F';R[3]='G';R[4]='I';R[5]='J';R[6]='K'; memset(mapUD,0,sizeof(mapUD)); memset(mapLR,0,sizeof(mapLR)); for(i=0;i<=6;i++) for(j=0;j<=6;j++) mapUD[D[i]][U[j]]=mapLR[R[i]][L[j]]=1; } int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } void merge(int x,int y) { x=find(x); y=find(y); if(x!=y) { if(num[x]>num[y]) fa[y]=x; else if(num[x]<num[y]) fa[x]=y; else { fa[x]=y; num[y]++; } } } int main(void) { int M,N,i,j,x,y,ans; prepare(); while(scanf("%d%d",&M,&N)!=EOF) { if(M==-1&&N==-1) break; for(i=0;i<M;i++) scanf("%s",map[i]); for(i=0;i<=M*N;i++) { fa[i]=i; num[i]=0; } for(i=0;i<M;i++) for(j=0;j<N;j++) { if(j<N-1&&mapLR[map[i][j]][map[i][j+1]]==1) { x=i*N+j; y=i*N+j+1; merge(x,y); } if(i<M-1&&mapUD[map[i][j]][map[i+1][j]]==1) { x=i*N+j; y=(i+1)*N+j; merge(x,y); } } ans=0; for(i=0;i<M*N;i++) if(fa[i]==i) ans++; printf("%d\n",ans); } return 0; }