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 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
#include <cstdio> #include <cstring> #define MAXN 510 int father[MAXN * MAXN], ranks[MAXN * MAXN]; int l = MAXN * MAXN - 1, r = MAXN * MAXN - 2; bool mp[MAXN][MAXN]; int vec[8][2] = {{-1,0},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1},{1,0},{0,1}};
void init_set() { for(int i = 0; i < MAXN * MAXN; i++){ father[i] = i; ranks[i] = 1; } for(int i = 0; i < MAXN; i++) { for(int j = 0; j < MAXN; j++) mp[i][j] = false; } }
int find_set(int x) { return father[x] == x ? father[x] : father[x] = find_set(father[x]); }
void union_set(int x, int y) { if(ranks[x] > ranks[y]){ father[y] = x; } else if(ranks[x] < ranks[y]){ father[x] = y; } else{ father[y] = x; ranks[x]++; } }
int main() { int T, q, x, y, ii, jj, n, m; scanf("%d", &T); getchar(); while(T--){ scanf("%d%d", &n, &m); init_set(); getchar(); for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ if(mp[i][j] = getchar() == '1'){ if(j == 0) union_set(find_set(l), find_set(i * m + j)); else if(j == m - 1) union_set(r, i * m + j); for (int k = 0; k < 8; ++k) { ii = i + vec[k][0]; jj = j + vec[k][1]; if (ii >= 0 && ii < n && jj >= 0 && jj < m && mp[ii][jj]) union_set(find_set(ii * m + jj), find_set(i * m + j)); } } } getchar(); } scanf("%d", &q); int year, ans = -1; for(year = 1; year <= q; ++year){ scanf("%d%d", &x, &y); if (~ans) continue; mp[x][y] = true;
if (y == 0) union_set(x * m + y, l); else if (y == m - 1) union_set(x * m + y, r); for (int k = 0; k < 8; ++k) { ii = x + vec[k][0]; jj = y + vec[k][1]; if (ii >= 0 && ii < n && jj >= 0 && jj < m && mp[ii][jj]) union_set(find_set(ii * m + jj), find_set(x * m + y)); } if(find_set(l) == find_set(r)) ans = year; } printf("%d\n", ans); } return 0; }
|