题目大意:给你地图,让你判断需要多少水才可以将农场灌满。
题解:显然用并查集比较容易,将可以连通的并起来,最后输出连通块的数目即可,一开始我用字母分类讨论发现很麻烦,于是参考别人的博客发现,直接自己写一个矩阵,然后处理一下读入数据会比较简单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 |
#include <cstring> #include <cstdio> #include <iostream> using
namespace std; int R[11][11]={{0,0,0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,1,1,1,1,0,1},{0,0,0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,1,1,1,1,0,1},{0,0,0,0,0,0,0,0,0,0,0}, {1,0,1,0,0,1,1,1,1,0,1},{1,0,1,0,0,1,1,1,1,0,1}, {0,0,0,0,0,0,0,0,0,0,0},{1,0,1,0,0,1,1,1,1,0,1}, {1,0,1,0,0,1,1,1,1,0,1},{1,0,1,0,0,1,1,1,1,0,1}}; int
U[11][11]={{0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0},{1,1,0,0,1,0,1,1,0,1,1}, {1,1,0,0,1,0,1,1,0,1,1},{1,1,0,0,1,0,1,1,0,1,1}, {0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0}, {1,1,0,0,1,0,1,1,0,1,1},{1,1,0,0,1,0,1,1,0,1,1}, {1,1,0,0,1,0,1,1,0,1,1},{1,1,0,0,1,0,1,1,0,1,1}}; string map[55]; int
f[3000]; void
init( int
n) { int
i; for (i=0;i<=n;i++) f[i]=i; } int
sf( int
i) { int
j=i; while (j!=f[j]) { j=f[j]; } return
f[i]=j; } int
Union( int
x, int y) { x=sf(x); y=sf(y); if (x==y) return
0; else { f[x]=y; return
1; } } int
main() { int
n,m; while ( scanf ( "%d%d" ,&m,&n),m!=-1&&n!=-1) { int
i,j; init(n*m); for (i=0;i<m;i++) cin>>map[i]; for (i=0;i<m;i++) for (j=1;j<n;j++) if (R[map[i][j-1]- ‘A‘ ][map[i][j]- ‘A‘ ]) Union(i*n+j-1,i*n+j); for (i=0;i<n;i++) for (j=1;j<m;j++) if (U[map[j-1][i]- ‘A‘ ][map[j][i]- ‘A‘ ]) Union((j-1)*n+i,j*n+i); int
count=0; for (i=0;i<n*m;i++) { if (f[i]==i) count++; } printf ( "%d\n" ,count); } return
0; } |
原文:http://www.cnblogs.com/forever97/p/3549352.html