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\n",sum) ;

50     }

51     return 0;

52 }
View Code

 

 

你可能感兴趣的:(HDU)