您的位置:首页 > 其它

hdu1198 并查集

2016-09-09 15:39 225 查看
#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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: