#include <iostream>
#include <queue>
using namespace std;
const long long int inf = 10e16;
bool tab[2010][2010];
int w = 1;
long long mini;
struct road{
long long a1,b1;
long long a2,b2;
};
struct kol{
int x,y;
kol(int a, int b){
x = a;
y = b;
}
};
road t[2010][2010];
queue <kol> k;
long long value1 = 1,value2 = 2;
int n,m;
bool czy(int i, int j, int p, int k, int add1, int add2){
bool ok = false;
int p1 = t[i-p][j-k].a1 * value1 + t[i-p][j-k].b1 * value2;
int p2 = (t[i][j].a1 + add1) * value1 + (t[i][j].b1 + add2) * value2;
if(p2 < p1){
t[i-p][j-k].a1 = t[i][j].a1 + add1;
t[i-p][j-k].b1 = t[i][j].b1 + add2;
ok = true;
}
p1 = t[i-p][j-k].a2 * value2 + t[i-p][j-k].b2 * value1;
p2 = (t[i][j].a2 + add1) * value2 + (t[i][j].b2 + add2) * value1;
if(p2 < p1){
t[i-p][j-k].a2 = t[i][j].a2 + add1;
t[i-p][j-k].b2 = t[i][j].b2 + add2;
ok = true;
}
return ok;
}
void BFS(int x, int y){
k.push(kol(x,y));
while(!k.empty()){
int i = k.front().x;
int j = k.front().y;
k.pop();
if(i && tab[i-1][j])
if(czy(i,j,1,0,0,1))
k.push(kol(i-1,j));
if(i < n && tab[i+1][j])
if(czy(i,j,-1,0,1,0))
k.push(kol(i+1,j));
if(j && tab[i][j-1])
if(czy(i,j,0,1,0,1))
k.push(kol(i,j-1));
if(j < m && tab[i][j+1])
if(czy(i,j,0,-1,1,0))
k.push(kol(i,j+1));
}
}
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> m;
int query; cin >> query;
for(int i = 0 ; i < n; i++){
for(int j = 0 ; j < m; j++){
char z; cin >> z;
if(i || j){
t[i][j].a1 = inf;
t[i][j].a2 = inf;
t[i][j].b1 = inf;
t[i][j].b2 = inf;
}
if(z == '.')
tab[i][j] = 1;
else
tab[i][j] = 0;
}
}
BFS(0,0);
if(t[n-1][m-1].a1 == inf){
cout << 999999999999999999 << " " << 0 << '\n';
return 0;
}
long long a,b; cin >> a >> b;
if(a >= b)
mini = t[n-1][m-1].a1 * a + t[n-1][m-1].b1 * b;
else
mini = t[n-1][m-1].a2 * a + t[n-1][m-1].b2 * b;
for(int i = 1 ; i < query; i++){
cin >> a >> b;
long long p;
if(a >= b)
p = t[n-1][m-1].a1 * a + t[n-1][m-1].b1 * b;
else
p = t[n-1][m-1].a2 * a + t[n-1][m-1].b2 * b;
if(p == mini)
w++;
if(p < mini){
w = 1;
mini = p;
}
}
cout << mini << " " << w << endl;
}
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> #include <queue> using namespace std; const long long int inf = 10e16; bool tab[2010][2010]; int w = 1; long long mini; struct road{ long long a1,b1; long long a2,b2; }; struct kol{ int x,y; kol(int a, int b){ x = a; y = b; } }; road t[2010][2010]; queue <kol> k; long long value1 = 1,value2 = 2; int n,m; bool czy(int i, int j, int p, int k, int add1, int add2){ bool ok = false; int p1 = t[i-p][j-k].a1 * value1 + t[i-p][j-k].b1 * value2; int p2 = (t[i][j].a1 + add1) * value1 + (t[i][j].b1 + add2) * value2; if(p2 < p1){ t[i-p][j-k].a1 = t[i][j].a1 + add1; t[i-p][j-k].b1 = t[i][j].b1 + add2; ok = true; } p1 = t[i-p][j-k].a2 * value2 + t[i-p][j-k].b2 * value1; p2 = (t[i][j].a2 + add1) * value2 + (t[i][j].b2 + add2) * value1; if(p2 < p1){ t[i-p][j-k].a2 = t[i][j].a2 + add1; t[i-p][j-k].b2 = t[i][j].b2 + add2; ok = true; } return ok; } void BFS(int x, int y){ k.push(kol(x,y)); while(!k.empty()){ int i = k.front().x; int j = k.front().y; k.pop(); if(i && tab[i-1][j]) if(czy(i,j,1,0,0,1)) k.push(kol(i-1,j)); if(i < n && tab[i+1][j]) if(czy(i,j,-1,0,1,0)) k.push(kol(i+1,j)); if(j && tab[i][j-1]) if(czy(i,j,0,1,0,1)) k.push(kol(i,j-1)); if(j < m && tab[i][j+1]) if(czy(i,j,0,-1,1,0)) k.push(kol(i,j+1)); } } int main() { ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; int query; cin >> query; for(int i = 0 ; i < n; i++){ for(int j = 0 ; j < m; j++){ char z; cin >> z; if(i || j){ t[i][j].a1 = inf; t[i][j].a2 = inf; t[i][j].b1 = inf; t[i][j].b2 = inf; } if(z == '.') tab[i][j] = 1; else tab[i][j] = 0; } } BFS(0,0); if(t[n-1][m-1].a1 == inf){ cout << 999999999999999999 << " " << 0 << '\n'; return 0; } long long a,b; cin >> a >> b; if(a >= b) mini = t[n-1][m-1].a1 * a + t[n-1][m-1].b1 * b; else mini = t[n-1][m-1].a2 * a + t[n-1][m-1].b2 * b; for(int i = 1 ; i < query; i++){ cin >> a >> b; long long p; if(a >= b) p = t[n-1][m-1].a1 * a + t[n-1][m-1].b1 * b; else p = t[n-1][m-1].a2 * a + t[n-1][m-1].b2 * b; if(p == mini) w++; if(p < mini){ w = 1; mini = p; } } cout << mini << " " << w << endl; } |
English