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