hdu1198 并查集

来源:互联网 发布:社交数据库设计 编辑:程序博客网 时间:2024/05/29 09:21
#include<cstdio>#include<cmath>#include<cstring>#include<iostream>#include<algorithm>#include<queue>#include<string>using namespace std;#define INF 0x3f3f3f3ftypedef __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,3yint 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
原创粉丝点击