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); } }
相关文章推荐
- hdu1198(并查集)
- 并查集的几道题(hdu1198)(1232)(1272)(1598)
- hdu1198 并查集(值得复习)
- Hdu1198 - Farm Irrigation - 并查集
- 并查集应用hdu1198
- HDU1198(不必暴力,并查集应用,0MS)
- hdu1198 二维并查集
- hdu1198(并查集)
- hdu1198 Farm Irrigation 并查集或者dfs
- HDU1198(Farm Irrigation)-并查集
- hdu1198 并查集
- (水题)并查集求连通块hdu1198
- hdu1198(并查集的应用)
- hdu1198--并查集
- hdu1198 并查集
- hdu1198 并查集
- 并查集
- 【BZOJ】1050: [HAOI2006]旅行comf(暴力+并查集)
- hdu 1181——并查集可能是我学的最好的算法了。。。。
- 【BZOJ4195】【NOI2015】程序自动分析(并查集)