#include<bits/stdc++.h> #define fi first #define se second #define pb push_back using namespace std; typedef pair<int,int> coord; typedef pair<string, coord> par; typedef pair<int, coord> q_par; vector<par> graf[2000009]; int col[2000009], n, m, q; string s1, s2; priority_queue<q_par, vector<q_par>, greater<q_par> > que; void solve() { int t, a, b, c, d, poz, tt; q_par p; par pp; cin>>t>>a>>b>>c>>d; for(int i=0; i<=(n+1)*(m+1); i++) col[i] = 0; while(!que.empty()) que.pop(); que.push(q_par(t, coord(a, b))); while(!que.empty()) { p = que.top(); que.pop(); t = p.fi; a = p.se.fi; b = p.se.se; poz = (m+1) * a + b; if(a == c && b == d) { cout<<t<<"\n"; return; } if(col[poz] == 1) continue; col[poz] = 1; for(int i=0; i<graf[poz].size(); i++) { pp = graf[poz][i]; if(col[(m+1) * pp.se.fi + pp.se.se] == 1) continue; tt = t; while(tt - t < 8) { if(pp.fi[tt % pp.fi.size()] == '1') { que.push(q_par(tt, pp.se)); break; } tt++; } } } return; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>s1; s2.clear(); for(int k=0; k<s1.size(); k++) { if(s1[k] == '0') s2.pb('1'); else s2.pb('0'); } graf[(m+1)*(i-1)+j-1].pb(par(s2, coord(i, j-1))); graf[(m+1)*i+j-1].pb(par(s2, coord(i-1, j-1))); graf[(m+1)*(i-1)+j].pb(par(s2, coord(i, j))); graf[(m+1)*i+j].pb(par(s2, coord(i-1, j))); graf[(m+1)*(i-1)+j-1].pb(par(s1, coord(i-1, j))); graf[(m+1)*i+j-1].pb(par(s1, coord(i, j))); graf[(m+1)*(i-1)+j].pb(par(s1, coord(i-1, j-1))); graf[(m+1)*i+j].pb(par(s1, coord(i, j-1))); } } for(int i=1; i<=q; i++) solve(); return 0; }
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 | #include<bits/stdc++.h> #define fi first #define se second #define pb push_back using namespace std; typedef pair<int,int> coord; typedef pair<string, coord> par; typedef pair<int, coord> q_par; vector<par> graf[2000009]; int col[2000009], n, m, q; string s1, s2; priority_queue<q_par, vector<q_par>, greater<q_par> > que; void solve() { int t, a, b, c, d, poz, tt; q_par p; par pp; cin>>t>>a>>b>>c>>d; for(int i=0; i<=(n+1)*(m+1); i++) col[i] = 0; while(!que.empty()) que.pop(); que.push(q_par(t, coord(a, b))); while(!que.empty()) { p = que.top(); que.pop(); t = p.fi; a = p.se.fi; b = p.se.se; poz = (m+1) * a + b; if(a == c && b == d) { cout<<t<<"\n"; return; } if(col[poz] == 1) continue; col[poz] = 1; for(int i=0; i<graf[poz].size(); i++) { pp = graf[poz][i]; if(col[(m+1) * pp.se.fi + pp.se.se] == 1) continue; tt = t; while(tt - t < 8) { if(pp.fi[tt % pp.fi.size()] == '1') { que.push(q_par(tt, pp.se)); break; } tt++; } } } return; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>q; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>s1; s2.clear(); for(int k=0; k<s1.size(); k++) { if(s1[k] == '0') s2.pb('1'); else s2.pb('0'); } graf[(m+1)*(i-1)+j-1].pb(par(s2, coord(i, j-1))); graf[(m+1)*i+j-1].pb(par(s2, coord(i-1, j-1))); graf[(m+1)*(i-1)+j].pb(par(s2, coord(i, j))); graf[(m+1)*i+j].pb(par(s2, coord(i-1, j))); graf[(m+1)*(i-1)+j-1].pb(par(s1, coord(i-1, j))); graf[(m+1)*i+j-1].pb(par(s1, coord(i, j))); graf[(m+1)*(i-1)+j].pb(par(s1, coord(i-1, j-1))); graf[(m+1)*i+j].pb(par(s1, coord(i, j-1))); } } for(int i=1; i<=q; i++) solve(); return 0; } |