#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAX = 100;
const int P = 840;
char s[MAX][MAX][8];
char l[MAX][MAX];
struct F {
F* parent;
int x, y;
int size;
int vid;
};
F f[P][MAX][MAX];
vector<vector<int>> g;
F* idtof[MAX*MAX*P];
F* find(F* x) {
if(x->parent != x) {
x->parent = find(x->parent);
return x->parent;
}
return x;
}
F* unio(F* x, F* y) {
x = find(x);
y = find(y);
if(x == y) return x;
if(x->size < y->size) {
F* tmp = x;
x = y;
y = tmp;
}
y->parent = x;
x->size += y->size;
return x;
}
int main() {
ios_base::sync_with_stdio(false);
int n , m, q;
cin >> n >> m >> q;
string str;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j) {
cin >> str;
for(int k = 0; k < str.size(); ++k) {
s[i][j][k] = str[k];
l[i][j] = str.size();
}
}
for(int t = 0; t < P; ++t){
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= m; ++j) {
f[t][i][j].parent = &f[t][i][j];
f[t][i][j].x = i;
f[t][i][j].y = j;
f[t][i][j].size = 1;
f[t][i][j].vid = -1;
}
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j) {
if(s[i][j][t%l[i][j]] == '0') {
unio(&f[t][i-1][j-1], &f[t][i][j-1]);
unio(&f[t][i-1][j], &f[t][i][j]);
} else {
unio(&f[t][i-1][j-1], &f[t][i-1][j]);
unio(&f[t][i][j-1], &f[t][i][j]);
}
}
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= m; ++j) {
if(f[t][i][j].parent == &f[t][i][j] && f[t][i][j].vid == -1) {
int id = g.size();
g.push_back(vector<int>());
idtof[id] = &f[t][i][j];
f[t][i][j].vid = id;
}
}
}
for(int t = 0; t < P; ++t){
for(int i = 0; i <= n; ++i)
for(int j = 0; j <= m; ++j) {
int r1 = find(&f[t][i][j])->vid;
int r2 = find(&f[(t+1)%P][i][j])->vid;
g[r1].push_back(r2);
}
}
for(int i = 0; i < g.size(); ++i) {
sort(g[i].begin(), g[i].end());
g[i].erase(unique(g[i].begin(), g[i].end()), g[i].end());
}
while(q--) {
int t, a, b, c, d;
cin >> t >> a >> b >> c >> d;
deque<pair<int, F*>> que;
F* fab = find(&f[t%P][a][b]);
que.push_back(make_pair(0, fab));
if(fab == find(&f[t%P][c][d])) {
cout << t << '\n';
continue;
}
bool ok = false;
while(!ok) {
pair<int, F*> front = que.front();
que.pop_front();
int v = front.second->vid;
int t2 = front.first;
for(int i = 0; i < g[v].size(); ++i) {
F* ff = idtof[g[v][i]];
if(find(&f[(t+t2+1)%P][c][d]) == ff) {
cout << t+t2+1 << '\n';
ok = true;
break;
}
que.push_back(make_pair(t2+1, ff));
}
}
}
}
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | #include <bits/stdc++.h> using namespace std; typedef long long LL; const int MAX = 100; const int P = 840; char s[MAX][MAX][8]; char l[MAX][MAX]; struct F { F* parent; int x, y; int size; int vid; }; F f[P][MAX][MAX]; vector<vector<int>> g; F* idtof[MAX*MAX*P]; F* find(F* x) { if(x->parent != x) { x->parent = find(x->parent); return x->parent; } return x; } F* unio(F* x, F* y) { x = find(x); y = find(y); if(x == y) return x; if(x->size < y->size) { F* tmp = x; x = y; y = tmp; } y->parent = x; x->size += y->size; return x; } int main() { ios_base::sync_with_stdio(false); int n , m, q; cin >> n >> m >> q; string str; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) { cin >> str; for(int k = 0; k < str.size(); ++k) { s[i][j][k] = str[k]; l[i][j] = str.size(); } } for(int t = 0; t < P; ++t){ for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j) { f[t][i][j].parent = &f[t][i][j]; f[t][i][j].x = i; f[t][i][j].y = j; f[t][i][j].size = 1; f[t][i][j].vid = -1; } for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) { if(s[i][j][t%l[i][j]] == '0') { unio(&f[t][i-1][j-1], &f[t][i][j-1]); unio(&f[t][i-1][j], &f[t][i][j]); } else { unio(&f[t][i-1][j-1], &f[t][i-1][j]); unio(&f[t][i][j-1], &f[t][i][j]); } } for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j) { if(f[t][i][j].parent == &f[t][i][j] && f[t][i][j].vid == -1) { int id = g.size(); g.push_back(vector<int>()); idtof[id] = &f[t][i][j]; f[t][i][j].vid = id; } } } for(int t = 0; t < P; ++t){ for(int i = 0; i <= n; ++i) for(int j = 0; j <= m; ++j) { int r1 = find(&f[t][i][j])->vid; int r2 = find(&f[(t+1)%P][i][j])->vid; g[r1].push_back(r2); } } for(int i = 0; i < g.size(); ++i) { sort(g[i].begin(), g[i].end()); g[i].erase(unique(g[i].begin(), g[i].end()), g[i].end()); } while(q--) { int t, a, b, c, d; cin >> t >> a >> b >> c >> d; deque<pair<int, F*>> que; F* fab = find(&f[t%P][a][b]); que.push_back(make_pair(0, fab)); if(fab == find(&f[t%P][c][d])) { cout << t << '\n'; continue; } bool ok = false; while(!ok) { pair<int, F*> front = que.front(); que.pop_front(); int v = front.second->vid; int t2 = front.first; for(int i = 0; i < g[v].size(); ++i) { F* ff = idtof[g[v][i]]; if(find(&f[(t+t2+1)%P][c][d]) == ff) { cout << t+t2+1 << '\n'; ok = true; break; } que.push_back(make_pair(t2+1, ff)); } } } } |
English