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\n",ans) ;
    }
    return 0 ;
}
View Code