#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; } |