#include <bits/stdc++.h>
#define PB push_back
using namespace std;
typedef unsigned long long int ll;
typedef vector <int> vi;
typedef pair <int,int> p_i;
#define FOR(k,a,b) for(int k=(a); k < (b); ++k)
#define fst first
#define snd second
const int N=1000001;
ll prt = (ll)1000000007;
int main()
{
int n,m,k;
scanf("%d %d %d\n",&n,&m,&k);
vector <string> safety;
for(int i=0;i<n;i++){
string s;
getline(cin,s);
safety.PB(s);
}
vector <p_i> speed;
for(int i=0;i<k;i++){
int a,b;
scanf("%d %d",&a,&b);
p_i p = make_pair(a,b);
speed.PB(p);
}
vector <vector<p_i>> steps;
for(int i=0;i<n;i++){
vector <p_i> v;
for(int j=0;j<m;j++){
p_i p = make_pair(-1,-1);
v.PB(p);
}
steps.PB(v);
}
steps[0][0].fst = 0;
steps[0][0].snd = 0;
queue <p_i> Q;
Q.push(p_i(0,0));
int d_i[4] = {-1,0,1,0};
int d_j[4] = {0,1,0,-1};
while(!Q.empty()){
p_i p = Q.front();
Q.pop();
int w = p.fst;
int k = p.snd;
for(int i=0;i<4;i++){
if(w+d_i[i]>=0 && w+d_i[i]<n && k+d_j[i]>=0 && k+d_j[i]<m){
if(safety[w+d_i[i]][k+d_j[i]]=='.'){
if(steps[w+d_i[i]][k+d_j[i]].fst==-1){
steps[w+d_i[i]][k+d_j[i]].fst = steps[w][k].fst;
steps[w+d_i[i]][k+d_j[i]].snd = steps[w][k].snd;
if(i==1 || i==2)steps[w+d_i[i]][k+d_j[i]].fst++;
else steps[w+d_i[i]][k+d_j[i]].snd++;
Q.push(p_i(w+d_i[i],k+d_j[i]));
}
}
}
}
}
ll fastest_time =ULLONG_MAX;
for(int i=0;i<k;i++){
ll time = (ll)speed[i].fst*(ll)steps[n-1][m-1].fst + (ll)speed[i].snd*(ll)steps[n-1][m-1].snd;
fastest_time = min(fastest_time,time);
}
int res = 0;
for(int i=0;i<k;i++){
ll time = (ll)speed[i].fst*(ll)steps[n-1][m-1].fst + (ll)speed[i].snd*(ll)steps[n-1][m-1].snd;
if(time==fastest_time)res++;
}
printf("%llu %d",fastest_time,res);
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 | #include <bits/stdc++.h> #define PB push_back using namespace std; typedef unsigned long long int ll; typedef vector <int> vi; typedef pair <int,int> p_i; #define FOR(k,a,b) for(int k=(a); k < (b); ++k) #define fst first #define snd second const int N=1000001; ll prt = (ll)1000000007; int main() { int n,m,k; scanf("%d %d %d\n",&n,&m,&k); vector <string> safety; for(int i=0;i<n;i++){ string s; getline(cin,s); safety.PB(s); } vector <p_i> speed; for(int i=0;i<k;i++){ int a,b; scanf("%d %d",&a,&b); p_i p = make_pair(a,b); speed.PB(p); } vector <vector<p_i>> steps; for(int i=0;i<n;i++){ vector <p_i> v; for(int j=0;j<m;j++){ p_i p = make_pair(-1,-1); v.PB(p); } steps.PB(v); } steps[0][0].fst = 0; steps[0][0].snd = 0; queue <p_i> Q; Q.push(p_i(0,0)); int d_i[4] = {-1,0,1,0}; int d_j[4] = {0,1,0,-1}; while(!Q.empty()){ p_i p = Q.front(); Q.pop(); int w = p.fst; int k = p.snd; for(int i=0;i<4;i++){ if(w+d_i[i]>=0 && w+d_i[i]<n && k+d_j[i]>=0 && k+d_j[i]<m){ if(safety[w+d_i[i]][k+d_j[i]]=='.'){ if(steps[w+d_i[i]][k+d_j[i]].fst==-1){ steps[w+d_i[i]][k+d_j[i]].fst = steps[w][k].fst; steps[w+d_i[i]][k+d_j[i]].snd = steps[w][k].snd; if(i==1 || i==2)steps[w+d_i[i]][k+d_j[i]].fst++; else steps[w+d_i[i]][k+d_j[i]].snd++; Q.push(p_i(w+d_i[i],k+d_j[i])); } } } } } ll fastest_time =ULLONG_MAX; for(int i=0;i<k;i++){ ll time = (ll)speed[i].fst*(ll)steps[n-1][m-1].fst + (ll)speed[i].snd*(ll)steps[n-1][m-1].snd; fastest_time = min(fastest_time,time); } int res = 0; for(int i=0;i<k;i++){ ll time = (ll)speed[i].fst*(ll)steps[n-1][m-1].fst + (ll)speed[i].snd*(ll)steps[n-1][m-1].snd; if(time==fastest_time)res++; } printf("%llu %d",fastest_time,res); return 0; } |
English