【HDOJ】1198 Farm Irrigation
其实就是并查集,写麻烦了,同样的代码第一次提交wa了,第二次就过了。
1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 55 5 #define UP 0 6 #define RIGHT 1 7 #define DOWN 2 8 #define LEFT 3 9 10 char buf[MAXNUM][MAXNUM]; 11 int bin[MAXNUM*MAXNUM]; 12 char visit[MAXNUM*MAXNUM][MAXNUM*MAXNUM]; 13 14 int direct[4][2] = {{-1,0},{0,1},{1,0},{0,-1}}; 15 // A B C D E 16 int pipes[11][4] = {{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0}, {1,0,1,0}, 17 // F G H I J 18 {0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1}, {1,1,1,0}, {1,1,1,1}}; 19 20 int find(int x) { 21 int r = x; 22 23 while (r != bin[r]) 24 r = bin[r]; 25 26 return r; 27 } 28 29 void merge(int x, int y) { 30 int fx, fy; 31 32 fx = find(x); 33 fy = find(y); 34 35 if (fx != fy) 36 bin[fx] = fy; 37 } 38 39 int main() { 40 int n, m; 41 int i, j, k, x, y, p, q, is, id, ns, nd; 42 43 while (scanf("%d %d%*c", &n, &m) != EOF) { 44 if (m<0 || n<0) 45 break; 46 for (i=0; i<n; ++i) 47 scanf("%s", buf[i]); 48 memset(visit, 0, sizeof(visit)); 49 for (i=0; i<n*m; ++i) 50 bin[i] = i; 51 for (i=0; i<n; ++i) { 52 for (j=0; j<m; ++j) { 53 is = buf[i][j] - 'A'; 54 ns = i*m+j; 55 for (k=0; k<4; ++k) { 56 x = i + direct[k][0]; 57 y = j + direct[k][1]; 58 if (x<0 || x>=n || y<0 || y>=m) 59 continue; 60 nd = x*m+y; 61 if (visit[ns][nd] || visit[nd][ns]) 62 continue; 63 id = buf[x][y] - 'A'; 64 switch (k) { 65 case UP: 66 p = pipes[is][UP]; 67 q = pipes[id][DOWN]; 68 break; 69 case RIGHT: 70 p = pipes[is][RIGHT]; 71 q = pipes[id][LEFT]; 72 break; 73 case DOWN: 74 p = pipes[is][DOWN]; 75 q = pipes[id][UP]; 76 break; 77 case LEFT: 78 p = pipes[is][LEFT]; 79 q = pipes[id][RIGHT]; 80 break; 81 default: ; 82 } 83 if (p && q) 84 merge(ns, nd); 85 visit[ns][nd] = 1; 86 visit[nd][ns] = 1; 87 } 88 } 89 } 90 k = 0; 91 92 for (i=0; i<n*m; ++i) { 93 if (i == bin[i]) 94 ++k; 95 } 96 printf("%d\n", k); 97 } 98 99 return 0; 100 }