HDU 1198

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

 

你可能感兴趣的:(HDU)