#include <cstdio> #include <queue> using namespace std; struct nextpoint { int x; int y; int w; nextpoint(int x, int y, int w): x(x), y(y), w(w) {} }; queue<nextpoint> punkty; bool trasa[2001][2001]; int ks[4][2] = {{0,1},{0,-1},{-1,0},{1,0}}; int n,m,k; int main() { scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; ++i){ char x[5000]; scanf("%s", x); for (int j = 0; j < m; ++j){ if (x[j] == '.'){ trasa[i][j] = true; } } } punkty.push(nextpoint(0,0,0)); trasa[0][0] = false; int res_length = 0; bool found = false; while(!found){ nextpoint p = punkty.front(); punkty.pop(); for(int i = 0; i < 4; ++i){ int newx = p.x + ks[i][0]; int newy = p.y + ks[i][1]; int neww = p.w + 1; //printf("CHECKIN: %d %d: %d ... ", newx, newy, neww); if (newx == n-1 && newy == m-1){ //printf(" FOUND! "); res_length = neww; found = true; } if (newx >= 0 && newx < n && newy >= 0 && newy < m && trasa[newx][newy]) { //printf("PUSHIN"); trasa[newx][newy] = false; punkty.push(nextpoint(newx,newy,neww)); } //printf("\n"); } } int str_route = n+m-2; int overroute = res_length - str_route; overroute /= 2; long long total_a = str_route + overroute; long long total_b = overroute; int rescount = 0; long long bestres = 1000000000000000000LL; for (int i = 0; i < k; ++i){ long long a,b; scanf("%lld %lld", &a, &b); long long res = total_a*a + total_b*b; if (res < bestres) { bestres = res; rescount = 1; } else if (res == bestres) { rescount++; } } printf("%lld %d\n", bestres, rescount); }
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 | #include <cstdio> #include <queue> using namespace std; struct nextpoint { int x; int y; int w; nextpoint(int x, int y, int w): x(x), y(y), w(w) {} }; queue<nextpoint> punkty; bool trasa[2001][2001]; int ks[4][2] = {{0,1},{0,-1},{-1,0},{1,0}}; int n,m,k; int main() { scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; ++i){ char x[5000]; scanf("%s", x); for (int j = 0; j < m; ++j){ if (x[j] == '.'){ trasa[i][j] = true; } } } punkty.push(nextpoint(0,0,0)); trasa[0][0] = false; int res_length = 0; bool found = false; while(!found){ nextpoint p = punkty.front(); punkty.pop(); for(int i = 0; i < 4; ++i){ int newx = p.x + ks[i][0]; int newy = p.y + ks[i][1]; int neww = p.w + 1; //printf("CHECKIN: %d %d: %d ... ", newx, newy, neww); if (newx == n-1 && newy == m-1){ //printf(" FOUND! "); res_length = neww; found = true; } if (newx >= 0 && newx < n && newy >= 0 && newy < m && trasa[newx][newy]) { //printf("PUSHIN"); trasa[newx][newy] = false; punkty.push(nextpoint(newx,newy,neww)); } //printf("\n"); } } int str_route = n+m-2; int overroute = res_length - str_route; overroute /= 2; long long total_a = str_route + overroute; long long total_b = overroute; int rescount = 0; long long bestres = 1000000000000000000LL; for (int i = 0; i < k; ++i){ long long a,b; scanf("%lld %lld", &a, &b); long long res = total_a*a + total_b*b; if (res < bestres) { bestres = res; rescount = 1; } else if (res == bestres) { rescount++; } } printf("%lld %d\n", bestres, rescount); } |