题意 :给你ABCDEFGHIJK 11个块,块上的图案如图所示,然后给你输入,将这些方块按照输入摆好,问你有几个联通块。
思路 :这个其实是个最简单的并查集,但是因为给的形式不好处理所以看不太出来,只要把那些图案处理好了就OK了。会神告诉我上下左右标记一下就行,像A可以标记为1,0,1,0。
1 #include <iostream> 2 #include <stdio.h> 3 4 using namespace std; 5 6 int a[12][4] = {{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1},{1,0,1,1},{1,1,1,0},{0,1,1,1},{1,1,0,1},{1,1,1,1}} ; 7 char ch[55][55] ; 8 int f[4000] ; 9 10 int find_set(int x) 11 { 12 if(x == f[x]) 13 return x ; 14 return f[x] = find_set(f[x]) ; 15 16 } 17 18 void Union(int x,int y) 19 { 20 int fx = find_set(x) ; 21 int fy = find_set(y) ; 22 if(fx != fy) 23 f[fx] = fy ; 24 } 25 int main() 26 { 27 int m,n ; 28 while(~scanf("%d %d",&n,&m)) 29 { 30 if(m == -1 && n == -1) break ; 31 for(int i = 0 ; i < m*n ; i++) 32 f[i] = i ; 33 for(int i = 0 ; i < n ; i++) 34 scanf("%s",ch[i]) ; 35 for(int i = 0 ; i < n ; i++) 36 { 37 for(int j = 0 ; j < m ; j++) 38 { 39 if(a[ch[i][j]-'A'][3] == 1 && a[ch[i][j+1]-'A'][2] == 1 && j+1 < m) 40 Union(i*m+j,i*m+j+1) ; 41 if(a[ch[i][j]-'A'][1] == 1 && a[ch[i+1][j]-'A'][0] == 1 && i+1 < n) 42 Union(i*m+j,(i+1)*m+j) ; 43 } 44 } 45 int sum = 0 ; 46 for(int i = 0 ; i < m*n ; i++) 47 if(f[i] == i) 48 sum++ ; 49 printf("%d ",sum) ; 50 } 51 return 0; 52 }