http://acm.hdu.edu.cn/showproblem.php?pid=1198 并查集: #include<iostream> using namespace std; struct Square { bool up,dowm,left,right; }; Square sq[11]={{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}}; const int N=52; int a[N*N],n,m; int find(int x) { int r,v,t; r=x; while(r!=a[r]) r=a[r]; v=x; while(v!=a[v]) { t=a[v]; a[v]=r; v=t; } return r; } void merge(int c1,int c2,int flag,int i,int j,int i2,int j2) { int x,y; y=i2*m+j2; x=i*m+j; if(flag) //向上 { if(sq[c1].up && sq[c2].dowm) { x=find(x); y=find(y); if(x!=y) a[x]=y; } } else //向左 { if(sq[c1].right && sq[c2].left) { x=find(x); y=find(y); if(x!=y) a[x]=y; } } } int main() { char s[N]; int i,j,v[N][N],c1,c2,cnt; while(cin>>n>>m ,n!=-1&&m!=-1) { for(i=0;i<n;i++) { cin>>s; for(j=0;j<m;j++) v[i][j]=s[j]-'A'; } for(i=0;i<n*m;i++) a[i]=i; for(i=0;i<n;i++) { for(j=0;j<m-1;j++) { if(i==0) { c1=v[i][j]; c2=v[i][j+1]; merge(c1,c2,0,i,j,i,j+1); } else { c1=v[i][j]; c2=v[i-1][j]; merge(c1,c2,1,i,j,i-1,j); c2=v[i][j+1]; merge(c1,c2,0,i,j,i,j+1); } } if(i!=0) { c1=v[i][j]; c2=v[i-1][j]; merge(c1,c2,1,i,j,i-1,j); } } for(cnt=i=0;i<m*n;i++) if(a[i]==i) cnt++; cout<<cnt<<endl; } return 0; }