#include <bits/stdc++.h> #define ff first #define ss second #define in insert #define er erase const int N=2010; const int M=2010; using namespace std; bool v[N][M]; int n,m,k,x,y,d,l; long long a,b,c,r,h,w=LLONG_MAX,t[N][M]; char s[N][M+1]; set <pair<int,pair<int,int>>> q; bool chk(int x, int y) { if (0<=x && x<n) { if (0<=y && y<m) { if (s[x][y]=='.') { if (!v[x][y]) { return 1; } } } } return 0; } int main() { scanf("%d %d %d",&n,&m,&k); r=n+m-2; for (int i=0; i<n; i++) { scanf("%s",s[i]); } q.in({0,{0,0}}); while (!q.empty()) { x = (*q.begin()).ss.ff; y = (*q.begin()).ss.ss; d = (*q.begin()).ff; q.er(q.begin()); v[x][y]=1; if (x==n-1 && y==m-1) { break; } if (chk(x+1,y)) { q.er({t[x+1][y],{x+1,y}}); t[x+1][y]=d; q.in({t[x+1][y],{x+1,y}}); } if (chk(x,y+1)) { q.er({t[x][y+1],{x,y+1}}); t[x][y+1]=d; q.in({t[x][y+1],{x,y+1}}); } if (chk(x-1,y)) { q.er({t[x-1][y],{x-1,y}}); t[x-1][y]=d+1; q.in({t[x-1][y],{x-1,y}}); } if (chk(x,y-1)) { q.er({t[x][y-1],{x,y-1}}); t[x][y-1]=d+1; q.in({t[x][y-1],{x,y-1}}); } } c=t[n-1][m-1]; for (int i=0; i<k; i++) { scanf("%lld %lld",&a,&b); h=(r+c)*a+c*b; if (h<w) { w=h; l=1; } else if (h==w) { l++; } } printf("%lld %d\n",w,l); 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 ff first #define ss second #define in insert #define er erase const int N=2010; const int M=2010; using namespace std; bool v[N][M]; int n,m,k,x,y,d,l; long long a,b,c,r,h,w=LLONG_MAX,t[N][M]; char s[N][M+1]; set <pair<int,pair<int,int>>> q; bool chk(int x, int y) { if (0<=x && x<n) { if (0<=y && y<m) { if (s[x][y]=='.') { if (!v[x][y]) { return 1; } } } } return 0; } int main() { scanf("%d %d %d",&n,&m,&k); r=n+m-2; for (int i=0; i<n; i++) { scanf("%s",s[i]); } q.in({0,{0,0}}); while (!q.empty()) { x = (*q.begin()).ss.ff; y = (*q.begin()).ss.ss; d = (*q.begin()).ff; q.er(q.begin()); v[x][y]=1; if (x==n-1 && y==m-1) { break; } if (chk(x+1,y)) { q.er({t[x+1][y],{x+1,y}}); t[x+1][y]=d; q.in({t[x+1][y],{x+1,y}}); } if (chk(x,y+1)) { q.er({t[x][y+1],{x,y+1}}); t[x][y+1]=d; q.in({t[x][y+1],{x,y+1}}); } if (chk(x-1,y)) { q.er({t[x-1][y],{x-1,y}}); t[x-1][y]=d+1; q.in({t[x-1][y],{x-1,y}}); } if (chk(x,y-1)) { q.er({t[x][y-1],{x,y-1}}); t[x][y-1]=d+1; q.in({t[x][y-1],{x,y-1}}); } } c=t[n-1][m-1]; for (int i=0; i<k; i++) { scanf("%lld %lld",&a,&b); h=(r+c)*a+c*b; if (h<w) { w=h; l=1; } else if (h==w) { l++; } } printf("%lld %d\n",w,l); return 0; } |