http://acm.hdu.edu.cn/showproblem.php?pid=1198
裸并查集,主要工作在根据题目给出关系构图
#include <iostream> #include <cstdio> #include <map> using namespace std ; int idx[2505] ; int m,n ; char M[55][55] ; int find(int x) { return idx[x]==x ? x : idx[x]=find(idx[x]) ; } int st ; int dx[]={1,-1,0,0} ; int dy[]={0,0,1,-1} ; void check() { for(int i=0 ;i<m ;i++) { for(int j=0 ;j<n ;j++) { for(int k=0 ;k<4 ;k++) { int xx=i+dx[k] ; int yy=j+dy[k] ; if(xx<0 || xx>=m || yy<0 || yy>=n)continue ; char t1=M[i][j] ; char t2=M[xx][yy] ; if(dx[k]==1) { if((t1=='C' || t1=='D' || t1=='E' || t1=='H' || t1=='I' || t1=='J' || t1=='K') && (t2=='A' || t2=='B' || t2=='E' || t2=='G' || t2=='H' || t2=='J' || t2=='K')) { int pp=find(st) ; int qq=find(st+n) ; if(pp!=qq) { idx[pp]=qq ; } } } else if(dx[k]==-1) { if((t1=='A' || t1=='B' || t1=='E' || t1=='H' || t1=='G' || t1=='J' || t1=='K') && (t2=='C' || t2=='D' || t2=='E' || t2=='H' || t2=='I' || t2=='J' || t2=='K')) { int pp=find(st) ; int qq=find(st-n) ; if(pp!=qq) { idx[pp]=qq ; } } } else if(dy[k]==1) { if((t1=='B' || t1=='D' || t1=='F' || t1=='G' || t1=='I' || t1=='J' || t1=='K') && (t2=='A' || t2=='C' || t2=='F' || t2=='G' || t2=='H' || t2=='I' || t2=='K')) { int pp=find(st) ; int qq=find(st+1) ; if(pp!=qq) { idx[pp]=qq ; } } } else if(dy[k]==-1) { if((t1=='A' || t1=='C' || t1=='F' || t1=='G' || t1=='I' || t1=='H' || t1=='K') && (t2=='B' || t2=='D' || t2=='F' || t2=='G' || t2=='I' || t2=='J' || t2=='K')) { int pp=find(st) ; int qq=find(st-1) ; if(pp!=qq) { idx[pp]=qq ; } } } } st++ ; } } } int main() { while(~scanf("%d%d",&m,&n)) { if(m==-1 && n==-1)break ; for(int i=0 ;i<m ;i++) scanf("%s",M[i]) ; for(int i=1 ;i<=n*m ;i++) idx[i]=i ; st=1 ; check() ; map <int,int> mp ; int ans=0 ; for(int i=1 ;i<=n*m ;i++) { int fa=find(i) ; if(!mp[fa]) { mp[fa]=1 ; ans++ ; } } printf("%d ",ans) ; } return 0 ; }