hdu1198 并查集

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
typedef __int64 ll;
int f[2505];
int _find(int x)
{
    if(x!=f[x])
        f[x]=_find(f[x]);
    return f[x];
}
char a[55][55];
int dir[11][11][4]={0};//0s,1x,2z,3y
int main()
{
    int n,m;
/*A*/dir[0][2][0]=1;dir[0][3][0]=1;dir[0][9][0]=1;
    dir[0][7][0]=1;dir[0][8][0]=1;dir[0][10][0]=1;
    dir[0][4][0]=1;
    dir[0][1][2]=1;dir[0][5][2]=1;dir[0][6][2]=1;
    dir[0][8][2]=1;dir[0][9][2]=1;dir[0][10][2]=1;
    dir[0][3][2]=1;
/*B*/dir[1][2][0]=1;dir[1][3][0]=1;dir[1][9][0]=1;
    dir[1][7][0]=1;dir[1][8][0]=1;dir[1][10][0]=1;
    dir[1][4][0]=1;
    dir[1][2][3]=1;dir[1][5][3]=1;dir[1][6][3]=1;
    dir[1][7][3]=1;dir[1][8][3]=1;dir[1][10][3]=1;
    dir[1][0][3]=1;
/*C*/dir[2][1][2]=1;dir[2][5][2]=1;dir[2][6][2]=1;
    dir[2][8][2]=1;dir[2][9][2]=1;dir[2][10][2]=1;
    dir[2][3][2]=1;
    dir[2][0][1]=1;dir[2][1][1]=1;dir[2][6][1]=1;
    dir[2][4][1]=1;dir[2][9][1]=1;dir[2][7][1]=1;
    dir[2][10][1]=1;
/*D*/dir[3][0][1]=1;dir[3][1][1]=1;dir[3][6][1]=1;
    dir[3][4][1]=1;dir[3][9][1]=1;dir[3][7][1]=1;
    dir[3][10][1]=1;
    dir[3][2][3]=1;dir[3][5][3]=1;dir[3][6][3]=1;
    dir[3][7][3]=1;dir[3][8][3]=1;dir[3][10][3]=1;
    dir[3][0][3]=1;
/*E*/dir[4][2][0]=1;dir[4][3][0]=1;dir[4][9][0]=1;
    dir[4][7][0]=1;dir[4][8][0]=1;dir[4][10][0]=1;
    dir[4][4][0]=1;
    dir[4][0][1]=1;dir[4][1][1]=1;dir[4][6][1]=1;
    dir[4][4][1]=1;dir[4][9][1]=1;dir[4][7][1]=1;
    dir[4][10][1]=1;
/*F*/dir[5][2][3]=1;dir[5][5][3]=1;dir[5][6][3]=1;
    dir[5][7][3]=1;dir[5][8][3]=1;dir[5][10][3]=1;
    dir[5][0][3]=1;
    dir[5][1][2]=1;dir[5][5][2]=1;dir[5][6][2]=1;
    dir[5][8][2]=1;dir[5][9][2]=1;dir[5][10][2]=1;
    dir[5][3][2]=1;
/*G*/dir[6][2][0]=1;dir[6][3][0]=1;dir[6][9][0]=1;
    dir[6][7][0]=1;dir[6][8][0]=1;dir[6][10][0]=1;
    dir[6][4][0]=1;
    dir[6][2][3]=1;dir[6][5][3]=1;dir[6][6][3]=1;
    dir[6][7][3]=1;dir[6][8][3]=1;dir[6][10][3]=1;
    dir[6][0][3]=1;
    dir[6][1][2]=1;dir[6][5][2]=1;dir[6][6][2]=1;
    dir[6][8][2]=1;dir[6][9][2]=1;dir[6][10][2]=1;
    dir[6][3][2]=1;
/*H*/dir[7][2][0]=1;dir[7][3][0]=1;dir[7][9][0]=1;
    dir[7][7][0]=1;dir[7][8][0]=1;dir[7][10][0]=1;
    dir[7][4][0]=1;
    dir[7][0][1]=1;dir[7][1][1]=1;dir[7][6][1]=1;
    dir[7][4][1]=1;dir[7][9][1]=1;dir[7][7][1]=1;
    dir[7][10][1]=1;
    dir[7][1][2]=1;dir[7][5][2]=1;dir[7][6][2]=1;
    dir[7][8][2]=1;dir[7][9][2]=1;dir[7][10][2]=1;
    dir[7][3][2]=1;
/*I*/dir[8][2][3]=1;dir[8][5][3]=1;dir[8][6][3]=1;
    dir[8][7][3]=1;dir[8][8][3]=1;dir[8][10][3]=1;
    dir[8][0][3]=1;
    dir[8][1][2]=1;dir[8][5][2]=1;dir[8][6][2]=1;
    dir[8][8][2]=1;dir[8][9][2]=1;dir[8][10][2]=1;
    dir[8][3][2]=1;
    dir[8][0][1]=1;dir[8][1][1]=1;dir[8][6][1]=1;
    dir[8][4][1]=1;dir[8][9][1]=1;dir[8][7][1]=1;
    dir[8][10][1]=1;
/*J*/dir[9][2][0]=1;dir[9][3][0]=1;dir[9][9][0]=1;
    dir[9][7][0]=1;dir[9][8][0]=1;dir[9][10][0]=1;
    dir[9][4][0]=1;
    dir[9][0][1]=1;dir[9][1][1]=1;dir[9][6][1]=1;
    dir[9][4][1]=1;dir[9][9][1]=1;dir[9][7][1]=1;
    dir[9][10][1]=1;
    dir[9][2][3]=1;dir[9][5][3]=1;dir[9][6][3]=1;
    dir[9][7][3]=1;dir[9][8][3]=1;dir[9][10][3]=1;
    dir[9][0][3]=1;
/*K*/dir[10][2][0]=1;dir[10][3][0]=1;dir[10][9][0]=1;
    dir[10][7][0]=1;dir[10][8][0]=1;dir[10][10][0]=1;
    dir[10][4][0]=1;
    dir[10][0][1]=1;dir[10][1][1]=1;dir[10][6][1]=1;
    dir[10][4][1]=1;dir[10][9][1]=1;dir[10][7][1]=1;
    dir[10][10][1]=1;
    dir[10][2][3]=1;dir[10][5][3]=1;dir[10][6][3]=1;
    dir[10][7][3]=1;dir[10][8][3]=1;dir[10][10][3]=1;
    dir[10][0][3]=1;
    dir[10][1][2]=1;dir[10][5][2]=1;dir[10][6][2]=1;
    dir[10][8][2]=1;dir[10][9][2]=1;dir[10][10][2]=1;
    dir[10][3][2]=1;
    while(scanf("%d%d",&n,&m))
    {   
        if(n==-1&&m==-1)
             break;
        for(int i=0;i<=n*m;i++) f[i]=i;
        for(int i=0;i<n;i++)
            scanf("%s",a[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if(dir[a[i][j]-'A'][a[i-1][j]-'A'][0]&&i-1>=0)
                {
                    int fa=_find(i*m+j),fb=_find((i-1)*m+j);
                    if(fa!=fb) fa>fb?f[fa]=fb:f[fb]=fa;
                }
                if(dir[a[i][j]-'A'][a[i][j-1]-'A'][2]&&j-1>=0)
                {
                    int fa=_find(i*m+j),fb=_find(i*m+j-1);
                    if(fa!=fb) fa>fb?f[fa]=fb:f[fb]=fa;
                }
                if(dir[a[i][j]-'A'][a[i+1][j]-'A'][1]&&i+1<n)
                {
                    int fa=_find(i*m+j),fb=_find((i+1)*m+j);
                    if(fa!=fb) fa>fb?f[fa]=fb:f[fb]=fa;
                }
                if(dir[a[i][j]-'A'][a[i][j+1]-'A'][3]&&j+1<m)
                {
                    int fa=_find(i*m+j),fb=_find(i*m+j+1);
                    if(fa!=fb) fa>fb?f[fa]=fb:f[fb]=fa;
                }
            }
        for(int i=0;i<n*m;i++)
             _find(i);
        sort(f,f+n*m);
        int tmp=f[0],num=1;
        for(int i=1;i<n*m;i++)
        {
             if(tmp!=f[i])
                 num++,tmp=f[i];
        }
        printf("%d\n",num);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值