这道题DFS,BFS,并查集好像都可以
觉得深搜跟并查集可能会更简单一些
1 #include "iostream" 2 #include "algorithm" 3 #include "memory.h" 4 #include "cmath" 5 #include "string" 6 using namespace std; 7 #define MAXN 550 8 9 10 char s[15][6] = { 11 { "1100" }, {"0110"}, {"1001"}, {"0011"}, {"0101"}, {"1010"}, {"1110"}, {"1101"}, {"1011"}, {"0111"}, {"1111"} 12 }; 13 int n, m,num; 14 int fa[MAXN*MAXN]; 15 string a[550]; 16 17 int find(int x) 18 { 19 if (fa[x] < 0) return x; 20 return fa[x] = find(fa[x]); 21 } 22 23 void merge(int a, int b) 24 { 25 int x = find(a); 26 int y = find(b); 27 if (x < y) { 28 fa[x] += fa[y]; 29 fa[y] = x; 30 } 31 if (x > y) { 32 fa[y] += fa[x]; 33 fa[x] = y; 34 } 35 } 36 37 void judge(int i, int j, int x, int y) 38 { 39 if (y < m && s[a[i][j] - 'A'][2] == '1' && s[a[i][y] - 'A'][0] == '1') 40 merge(i*m + j, i*m + y); 41 if (x < n && s[a[i][j] - 'A'][3] == '1' && s[a[x][j] - 'A'][1] == '1') 42 merge(i*m + j, x*m + j); 43 } 44 45 46 void init() 47 { 48 memset(fa,-1,sizeof(fa)); 49 num = 0; 50 } 51 52 int main() 53 { 54 while (cin >> n >> m) { 55 if (n < 1 || m < 1) break; 56 init(); 57 for (int i = 0; i < n; ++i){ 58 a[i].clear(); 59 cin >> a[i]; 60 } 61 for (int i = 0; i < n; ++ i) 62 for (int j = 0; j < m; ++j) { 63 int x = i + 1; 64 int y = j + 1; 65 judge(i,j,x,y); 66 } 67 for (int i = 0; i < n*m; ++i) 68 if (fa[i] < 0) num++; 69 //cout << fa[i] << " "; 70 cout << num << endl; 71 } 72 return 0; 73 }