• 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
    ",ans) ;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    调停者模式
    组合模式
    单例模式
    策略模式
    代理模式
    AJPFX简述Context.startService()和Context.bindService
    AJPFX简述abstract class和interface的区别
    AJPFX关于抽象类和接口的区别
    AJPFX关于StringBuffer,StringBuilder类 总结(一)
    AJPFX关于StringBuffer,StringBuilder类总结(二)
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/3652155.html
Copyright © 2020-2023  润新知