BFS。当水滴破裂飞溅后,直到碰到水滴才会停止(观察case1)。同时,考虑当水滴飞溅到点(x,y)并且该点同一时间破裂的情况,该水滴算作吸收。
1 /* 3451 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 using namespace std; 8 9 #define MAXN 105 10 11 typedef struct node_t{ 12 int x,y,d,t; 13 node_t() {} 14 node_t(int xx, int yy, int dd, int tt) { 15 x = xx; y = yy; d = dd; t = tt; 16 } 17 } node_t; 18 19 node_t beg; 20 int bx, by; 21 int n, m, l; 22 int map[MAXN][MAXN]; 23 int t[MAXN][MAXN]; 24 int dir[4][2] = { 25 -1,0,1,0,0,-1,0,1 26 }; 27 28 inline bool check(int x, int y) { 29 return x<0 || x>=n || y<0 || y>=m; 30 } 31 32 bool isValid() { 33 int i, j; 34 35 for (i=0; i<n; ++i) 36 for (j=0; j<m; ++j) 37 if (map[i][j]) 38 return false; 39 return true; 40 } 41 42 void bfs() { 43 int x, y, d; 44 int i, j, k; 45 node_t nd; 46 queue<node_t> Q; 47 48 memset(t, 0, sizeof(t)); 49 if (map[bx][by] == l) { 50 map[bx][by] = 0; 51 t[bx][by] = 1; 52 nd.t = 2; 53 for (i=0; i<4; ++i) { 54 nd.x = bx + dir[i][0]; 55 nd.y = by + dir[i][1]; 56 if (check(nd.x, nd.y)) 57 continue; 58 nd.d = i; 59 Q.push(nd); 60 } 61 } else { 62 ++map[bx][by]; 63 return ; 64 } 65 66 while (!Q.empty()) { 67 nd = Q.front(); 68 Q.pop(); 69 if (map[nd.x][nd.y] == l) { 70 // break 71 map[nd.x][nd.y] = 0; 72 t[nd.x][nd.y] = nd.t; 73 for (i=0; i<4; ++i) { 74 x = nd.x + dir[i][0]; 75 y = nd.y + dir[i][1]; 76 if (check(x, y)) 77 continue; 78 Q.push(node_t(x, y, i, nd.t+1)); 79 } 80 } else if (map[nd.x][nd.y]) { 81 // absorb 82 ++map[nd.x][nd.y]; 83 } else if (t[nd.x][nd.y] != nd.t) { 84 // no drop, continue fly 85 x = nd.x + dir[nd.d][0]; 86 y = nd.y + dir[nd.d][1]; 87 if (check(x, y)) 88 continue; 89 Q.push(node_t(x, y, nd.d, nd.t+1)); 90 } 91 } 92 } 93 94 int main() { 95 int t; 96 int i, j, k; 97 bool flag; 98 99 #ifndef ONLINE_JUDGE 100 freopen("data.in", "r", stdin); 101 freopen("data.out", "w", stdout); 102 #endif 103 104 scanf("%d", &t); 105 while (t--) { 106 scanf("%d %d %d", &n, &m, &l); 107 flag = false; 108 for (i=0; i<n; ++i) { 109 for (j=0; j<m; ++j) { 110 scanf("%d", &map[i][j]); 111 } 112 } 113 flag = isValid(); 114 scanf("%d", &k); 115 while (k--) { 116 scanf("%d %d", &bx, &by); 117 --bx; --by; 118 if (flag == false) { 119 bfs(); 120 flag = isValid(); 121 } 122 } 123 if (flag) { 124 puts("YES"); 125 } else { 126 puts("NO"); 127 for (i=0; i<n; ++i) { 128 for (j=0; j<m; ++j) 129 printf("%d ", map[i][j]); 130 printf(" "); 131 } 132 } 133 } 134 135 return 0; 136 }