#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; } |
English