#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define st first
#define nd second
bool nieb[2000][2000];//niebezpieczenstwo
ll Dijkstra(ll n, ll m, ll gora, ll dol)
{
vector<vector<ll>> d;
d.resize(n);
for(auto& e:d)
e.resize(m);
d[0][0] = 1;//0 oznacza nieskonczonosc
priority_queue<pair<ll, pair<ll,ll>>> Q;
Q.push({-d[0][0], {0,0}});
while(!Q.empty())
{
pair<ll,ll> v = Q.top().nd;
Q.pop();
if(v.st+1<n && !nieb[v.st+1][v.nd] && (d[v.st+1][v.nd]> d[v.st][v.nd]+gora || d[v.st+1][v.nd]==0 ))
{
d[v.st+1][v.nd] = d[v.st][v.nd]+gora;
Q.push({-d[v.st+1][v.nd],{v.st+1,v.nd}});
}
if(v.st-1>=0 && !nieb[v.st-1][v.nd] && (d[v.st-1][v.nd]> d[v.st][v.nd]+dol || d[v.st-1][v.nd]==0))
{
d[v.st-1][v.nd] = d[v.st][v.nd]+dol;
Q.push({-d[v.st-1][v.nd],{v.st-1,v.nd}});
}
if(v.nd+1<m && !nieb[v.st][v.nd+1] && (d[v.st][v.nd+1]> d[v.st][v.nd]+gora || d[v.st][v.nd+1]==0))
{
d[v.st][v.nd+1] = d[v.st][v.nd]+gora;
Q.push({-d[v.st][v.nd+1],{v.st,v.nd+1}});
}
if(v.nd-1>=0 && !nieb[v.st][v.nd-1] && (d[v.st][v.nd-1]> d[v.st][v.nd]+dol || d[v.st][v.nd-1]==0))
{
d[v.st][v.nd-1] = d[v.st][v.nd]+dol;
Q.push({-d[v.st][v.nd-1],{v.st,v.nd-1}});
}
}
/*for(auto& k:d)
{
for(auto& e:k)
cout<<e<<" ";
cout<<"\n";
}*/
return d[n-1][m-1]-1;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll n, m;
cin>>n>>m;
ll k;
cin>>k;
for(ll i = 0; i<n; i++)
{
for(ll j=0; j<m; j++)
{
char z;
cin>>z;
if(z=='X')
nieb[i][j]=true;
}
}
vector<ll> czasy;
czasy.resize(k);
for(ll z = 0; z<k; z++)//dla kazdego znajomego
{
ll gora, dol;
cin>>gora>>dol;
czasy[z]=Dijkstra(n,m,gora,dol);
}
ll min = czasy[0];
for(auto& t:czasy)
{
if(t<min)
min=t;
}
ll ilosc=0;
for(auto& t: czasy)
{
if(t==min)
ilosc++;
}
cout<<min<<" "<<ilosc;
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long ll; #define st first #define nd second bool nieb[2000][2000];//niebezpieczenstwo ll Dijkstra(ll n, ll m, ll gora, ll dol) { vector<vector<ll>> d; d.resize(n); for(auto& e:d) e.resize(m); d[0][0] = 1;//0 oznacza nieskonczonosc priority_queue<pair<ll, pair<ll,ll>>> Q; Q.push({-d[0][0], {0,0}}); while(!Q.empty()) { pair<ll,ll> v = Q.top().nd; Q.pop(); if(v.st+1<n && !nieb[v.st+1][v.nd] && (d[v.st+1][v.nd]> d[v.st][v.nd]+gora || d[v.st+1][v.nd]==0 )) { d[v.st+1][v.nd] = d[v.st][v.nd]+gora; Q.push({-d[v.st+1][v.nd],{v.st+1,v.nd}}); } if(v.st-1>=0 && !nieb[v.st-1][v.nd] && (d[v.st-1][v.nd]> d[v.st][v.nd]+dol || d[v.st-1][v.nd]==0)) { d[v.st-1][v.nd] = d[v.st][v.nd]+dol; Q.push({-d[v.st-1][v.nd],{v.st-1,v.nd}}); } if(v.nd+1<m && !nieb[v.st][v.nd+1] && (d[v.st][v.nd+1]> d[v.st][v.nd]+gora || d[v.st][v.nd+1]==0)) { d[v.st][v.nd+1] = d[v.st][v.nd]+gora; Q.push({-d[v.st][v.nd+1],{v.st,v.nd+1}}); } if(v.nd-1>=0 && !nieb[v.st][v.nd-1] && (d[v.st][v.nd-1]> d[v.st][v.nd]+dol || d[v.st][v.nd-1]==0)) { d[v.st][v.nd-1] = d[v.st][v.nd]+dol; Q.push({-d[v.st][v.nd-1],{v.st,v.nd-1}}); } } /*for(auto& k:d) { for(auto& e:k) cout<<e<<" "; cout<<"\n"; }*/ return d[n-1][m-1]-1; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n, m; cin>>n>>m; ll k; cin>>k; for(ll i = 0; i<n; i++) { for(ll j=0; j<m; j++) { char z; cin>>z; if(z=='X') nieb[i][j]=true; } } vector<ll> czasy; czasy.resize(k); for(ll z = 0; z<k; z++)//dla kazdego znajomego { ll gora, dol; cin>>gora>>dol; czasy[z]=Dijkstra(n,m,gora,dol); } ll min = czasy[0]; for(auto& t:czasy) { if(t<min) min=t; } ll ilosc=0; for(auto& t: czasy) { if(t==min) ilosc++; } cout<<min<<" "<<ilosc; } |
English