#include<cstdio> #include<algorithm> #include<queue> #include<utility> #define MAXN 2003 const long long INF = 2000000000000000007LL; using namespace std; int n, m, k, o_w, o_k; char g[MAXN][MAXN]; long long a, b; long long czas, ile_a, ile_b; long long min_czas = INF; int ile_najlepszych; struct miejsce { int w, k, odl; }; bool odw[MAXN][MAXN]; int w_offs[] = {-1, 1, 0, 0}; int k_offs[] = {0, 0, -1, 1}; queue<miejsce> q; int bfs() { q.push(miejsce{0, 0, 0}); odw[0][0] = 1; while(!q.empty()) { miejsce qf = q.front(); q.pop(); if (qf.w == (n-1) && qf.k == (m-1)) { return qf.odl; } for(int i = 0; i < 4; i++) { o_w = qf.w + w_offs[i]; o_k = qf.k + k_offs[i]; if ((o_w >= 0) && (o_w < n) && (o_k >= 0) && (o_k < m) && (!odw[o_w][o_k]) && (g[o_w][o_k] == '.')) { odw[o_w][o_k] = 1; q.push(miejsce{o_w, o_k, qf.odl + 1}); } } } return -1; } int main () { scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; i++) { scanf("%s", g[i]); } int odl = bfs(); ile_a = (n + m - 2); odl -= (n + m - 2); ile_a += odl/2; ile_b = odl/2; for (int i = 0; i < k; i++) { scanf("%lld %lld", &a, &b); czas = ile_a*a + ile_b*b; if(czas < min_czas) { ile_najlepszych = 1; min_czas = czas; } else if(czas == min_czas) { ile_najlepszych++; } } printf("%lld %d\n", min_czas, ile_najlepszych); 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 | #include<cstdio> #include<algorithm> #include<queue> #include<utility> #define MAXN 2003 const long long INF = 2000000000000000007LL; using namespace std; int n, m, k, o_w, o_k; char g[MAXN][MAXN]; long long a, b; long long czas, ile_a, ile_b; long long min_czas = INF; int ile_najlepszych; struct miejsce { int w, k, odl; }; bool odw[MAXN][MAXN]; int w_offs[] = {-1, 1, 0, 0}; int k_offs[] = {0, 0, -1, 1}; queue<miejsce> q; int bfs() { q.push(miejsce{0, 0, 0}); odw[0][0] = 1; while(!q.empty()) { miejsce qf = q.front(); q.pop(); if (qf.w == (n-1) && qf.k == (m-1)) { return qf.odl; } for(int i = 0; i < 4; i++) { o_w = qf.w + w_offs[i]; o_k = qf.k + k_offs[i]; if ((o_w >= 0) && (o_w < n) && (o_k >= 0) && (o_k < m) && (!odw[o_w][o_k]) && (g[o_w][o_k] == '.')) { odw[o_w][o_k] = 1; q.push(miejsce{o_w, o_k, qf.odl + 1}); } } } return -1; } int main () { scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; i++) { scanf("%s", g[i]); } int odl = bfs(); ile_a = (n + m - 2); odl -= (n + m - 2); ile_a += odl/2; ile_b = odl/2; for (int i = 0; i < k; i++) { scanf("%lld %lld", &a, &b); czas = ile_a*a + ile_b*b; if(czas < min_czas) { ile_najlepszych = 1; min_czas = czas; } else if(czas == min_czas) { ile_najlepszych++; } } printf("%lld %d\n", min_czas, ile_najlepszych); return 0; } |