Farm Irrigation
1 #include <iostream>
2 using namespace std;
3
4 struct Node
5 {
6 bool t, b, l, r;
7 }map[55][55];
8
9 int p[100001];
10
11 void make_set()
12 {
13 for(int i = 0; i < 100001; ++i)
14 p[i] = i;
15 }
16
17 int find_set(int x)
18 {
19 if(x != p[x])
20 p[x] = find_set(p[x]);
21 return p[x];
22 }
23
24 void union_set(int x, int y)
25 {
26 x = find_set(x);
27 y = find_set(y);
28 if(x != y)
29 p[y] = x;
30 }
31
32 int main()
33 {
34 int m, n;
35 while(scanf("%d%d", &m, &n) && n >= 0 && m >= 0)
36 {
37 int i, j;
38 char c;
39 memset(map, 0, sizeof(map));
40 for(i = 0; i < m; ++i)
41 for(int j = 0; j < n; ++j)
42 {
43 cin >> c;
44 if(c == 'A' || c == 'B' || c == 'E' || c == 'H'\
45 || c == 'G' || c == 'J' || c == 'K')
46 map[i][j].t = true;
47 if(c == 'C' || c == 'D' || c == 'E' || c == 'H'\
48 || c == 'I' || c == 'J' || c == 'K')
49 map[i][j].b = true;
50 if(c == 'A' || c == 'C' || c == 'F' || c == 'G'\
51 || c == 'H' || c == 'I' || c == 'K')
52 map[i][j].l = true;
53 if(c == 'B' || c == 'D' || c == 'F' || c == 'G'\
54 || c == 'I' || c == 'J' || c == 'K')
55 map[i][j].r = true;
56 }
57 make_set();
58 for(i = 1; i < n; ++i)
59 {
60 if(map[0][i].l == true && map[0][i-1].r == true)
61 union_set(i, i-1);/////////
62 }
63 for(i = 1; i < m; ++i)
64 {
65 if(map[i][0].t == true && map[i-1][0].b == true)
66 union_set(i*n, (i-1)*n);/////////
67 }
68 for(i = 1; i < m; ++i)
69 for(j = 1; j < n; ++j)
70 {
71 if(map[i][j].t && map[i-1][j].b)
72 {
73 union_set(i*n+j, (i-1)*n+j);
74 }
75 if(map[i][j].l && map[i][j-1].r)
76 {
77 union_set(i*n+j, i*n+j-1);
78 }
79 }
80 int count = 0;
81 for(i = 0; i < m * n; ++i)
82 if(p[i] == i)
83 count++;
84 cout << count << endl;
85 }
86 return 0;
87 }
自己思路比较清晰的一次并查集使用,就是内存有点大儿,不过思路比较简单,也很清楚
原来也还好,关键是数组开得太大了。。。

浙公网安备 33010602011771号