#include <bits/stdc++.h>
using namespace std;
const int INF=2*1e9;
struct edge
{
int v;
int type;
int cross;
};
struct ver
{
int num;
int val;
};
bool operator<(ver a, ver b)
{
if(a.val!=b.val)
return a.val>b.val;
return a.num>b.num;
}
priority_queue<ver> q;
vector<int> v;
vector<int> done;
int dijkstra(const vector<vector<edge>>& graph, const vector<string>& crossings, int t, int start, int finish, int n, int m)
{
v.clear();
done.clear();
v.resize((n+1)*(m+1));
fill(v.begin(),v.end(),INF);
done.resize((n+1)*(m+1));
fill(done.begin(),done.end(),0);
v[start]=t;
q.push({start,t});
while(!q.empty())
{
ver x=q.top();
q.pop();
if(done[x.num]==0)
{
for(edge y:graph[x.num])
{
int d=x.val;
while(crossings[y.cross][d%crossings[y.cross].length()]-'0'!=y.type)
++d;
v[y.v]=min(v[y.v],d);
q.push({y.v,v[y.v]});
}
}
done[x.num]=1;
}
return v[finish];
}
int main()
{
ios_base::sync_with_stdio(false); cin.tie(); cout.tie(0);
int n,m,q;
cin>>n>>m>>q;
vector<string> crossings(n*m);
for(int i=0; i<n*m; ++i)
cin>>crossings[i];
vector<vector<edge>> graph((n+1)*(m+1));
for(int i=0; i<n*m; ++i)
{
graph[i+i/m].push_back({i+i/m+1,1,i});
graph[i+i/m+1].push_back({i+i/m,1,i});
graph[i+i/m].push_back({i+i/m+m+1,0,i});
graph[i+i/m+m+1].push_back({i+i/m,0,i});
graph[i+i/m+1].push_back({i+i/m+m+2,0,i});
graph[i+i/m+m+2].push_back({i+i/m+1,0,i});
graph[i+i/m+m+1].push_back({i+i/m+m+2,1,i});
graph[i+i/m+m+2].push_back({i+i/m+m+1,1,i});
}
for(int i=0; i<q; ++i)
{
int t,a,b,c,d;
cin>>t>>a>>b>>c>>d;
int start=a*(m+1)+b;
int finish=c*(m+1)+d;
cout<<dijkstra(graph,crossings,t,start,finish,n,m)<<endl;
}
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 90 91 92 | #include <bits/stdc++.h> using namespace std; const int INF=2*1e9; struct edge { int v; int type; int cross; }; struct ver { int num; int val; }; bool operator<(ver a, ver b) { if(a.val!=b.val) return a.val>b.val; return a.num>b.num; } priority_queue<ver> q; vector<int> v; vector<int> done; int dijkstra(const vector<vector<edge>>& graph, const vector<string>& crossings, int t, int start, int finish, int n, int m) { v.clear(); done.clear(); v.resize((n+1)*(m+1)); fill(v.begin(),v.end(),INF); done.resize((n+1)*(m+1)); fill(done.begin(),done.end(),0); v[start]=t; q.push({start,t}); while(!q.empty()) { ver x=q.top(); q.pop(); if(done[x.num]==0) { for(edge y:graph[x.num]) { int d=x.val; while(crossings[y.cross][d%crossings[y.cross].length()]-'0'!=y.type) ++d; v[y.v]=min(v[y.v],d); q.push({y.v,v[y.v]}); } } done[x.num]=1; } return v[finish]; } int main() { ios_base::sync_with_stdio(false); cin.tie(); cout.tie(0); int n,m,q; cin>>n>>m>>q; vector<string> crossings(n*m); for(int i=0; i<n*m; ++i) cin>>crossings[i]; vector<vector<edge>> graph((n+1)*(m+1)); for(int i=0; i<n*m; ++i) { graph[i+i/m].push_back({i+i/m+1,1,i}); graph[i+i/m+1].push_back({i+i/m,1,i}); graph[i+i/m].push_back({i+i/m+m+1,0,i}); graph[i+i/m+m+1].push_back({i+i/m,0,i}); graph[i+i/m+1].push_back({i+i/m+m+2,0,i}); graph[i+i/m+m+2].push_back({i+i/m+1,0,i}); graph[i+i/m+m+1].push_back({i+i/m+m+2,1,i}); graph[i+i/m+m+2].push_back({i+i/m+m+1,1,i}); } for(int i=0; i<q; ++i) { int t,a,b,c,d; cin>>t>>a>>b>>c>>d; int start=a*(m+1)+b; int finish=c*(m+1)+d; cout<<dijkstra(graph,crossings,t,start,finish,n,m)<<endl; } return 0; } |
English