#include <stdio.h> #include <map> #include <climits> using namespace std; struct MAP { int safe; int dist; int visited; }; multimap<int, int> q; MAP t[2000][2000]; //[m/x][n/y] void add(int x, int y, int d) { if(t[x][y].visited != 0 || t[x][y].safe == 0) { return; } q.insert({d, x*10000+y}); } int main() { int n, m, k; long long int a, b; char dragons; scanf("%d %d %d", &n, &m, &k); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf(" %c", &dragons); t[j][i].safe = (dragons == '.' ? 1 : 0); t[j][i].dist = 3000*3000; t[j][i].visited = 0; } } add(0, 0, 0); while(!q.empty()) { int ex = q.begin()->second / 10000; int ey = q.begin()->second % 10000; int ed = q.begin()->first; q.erase(q.begin()); if(t[ex][ey].visited == 1) { continue; } // printf("visiting %d %d\n", ex, ey); t[ex][ey].visited = 1; t[ex][ey].dist = ed; if(ex+1 < m) { add(ex+1, ey, ed); } if(ex-1 >= 0) { add(ex-1, ey, ed+1); } if(ey+1 < n) { add(ex, ey+1, ed); } if(ey-1 >= 0) { add(ex, ey-1, ed+1); } } long long int time = LLONG_MAX; long long int count = 0ll; long long int up_times = n + m + t[m-1][n-1].dist - 2LL; long long int down_times = t[m-1][n-1].dist; for(int i = 0ll; i < k; i++) { scanf("%lld %lld", &a, &b); long long int est_time = up_times * a + down_times * b; if(est_time == time) { count++; } else if(est_time < time) { time = est_time; count = 1ll; } } // printf("up=%lld down=%lld\n", up_times, down_times); printf("%lld %lld", time, count); 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 | #include <stdio.h> #include <map> #include <climits> using namespace std; struct MAP { int safe; int dist; int visited; }; multimap<int, int> q; MAP t[2000][2000]; //[m/x][n/y] void add(int x, int y, int d) { if(t[x][y].visited != 0 || t[x][y].safe == 0) { return; } q.insert({d, x*10000+y}); } int main() { int n, m, k; long long int a, b; char dragons; scanf("%d %d %d", &n, &m, &k); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf(" %c", &dragons); t[j][i].safe = (dragons == '.' ? 1 : 0); t[j][i].dist = 3000*3000; t[j][i].visited = 0; } } add(0, 0, 0); while(!q.empty()) { int ex = q.begin()->second / 10000; int ey = q.begin()->second % 10000; int ed = q.begin()->first; q.erase(q.begin()); if(t[ex][ey].visited == 1) { continue; } // printf("visiting %d %d\n", ex, ey); t[ex][ey].visited = 1; t[ex][ey].dist = ed; if(ex+1 < m) { add(ex+1, ey, ed); } if(ex-1 >= 0) { add(ex-1, ey, ed+1); } if(ey+1 < n) { add(ex, ey+1, ed); } if(ey-1 >= 0) { add(ex, ey-1, ed+1); } } long long int time = LLONG_MAX; long long int count = 0ll; long long int up_times = n + m + t[m-1][n-1].dist - 2LL; long long int down_times = t[m-1][n-1].dist; for(int i = 0ll; i < k; i++) { scanf("%lld %lld", &a, &b); long long int est_time = up_times * a + down_times * b; if(est_time == time) { count++; } else if(est_time < time) { time = est_time; count = 1ll; } } // printf("up=%lld down=%lld\n", up_times, down_times); printf("%lld %lld", time, count); return 0; } |