HDU 1198 Farm Irrigation

点我看题目

题意 :给你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 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3664197.html