#include <cstdio>
#include <queue>
#include <utility>
#include <tuple>
using namespace std;
const int NMAX = 2000 + 7;
int n, m, k;
char field[NMAX][NMAX];
queue<tuple<int, int, int, int> > q_e;
int main() {
int up_end = -1, down_end = -1;
scanf("%d %d %d", &n, &m, &k);
for (int i = 0; i < n; i++)
scanf("%s", field[i]);
q_e.push(make_tuple(0, 0, 0, 0));
while(!q_e.empty()) {
tuple<int, int, int, int> p = q_e.front();
int x = get<0>(p), y = get<1>(p);
int up = get<2>(p), down = get<3>(p);
q_e.pop();
// printf("%d %d\n", x, y);
if (0 <= x && x < n && 0 <= y && y < m && field[x][y] == '.') {
field[x][y] = 'O';
// printf("|| %d %d %d %d || \n", x, y, up, down);
if(x == n - 1 && y == m - 1) {
up_end = up;
down_end = down;
break;
}
if (0 < x)
q_e.push(make_tuple(x - 1, y, up, down + 1));
if (x < n - 1)
q_e.push(make_tuple(x + 1, y, up + 1, down));
if (0 < y)
q_e.push(make_tuple(x, y - 1, up, down + 1));
if (y < m - 1)
q_e.push(make_tuple(x, y + 1, up + 1, down));
/*for (int i = -1; i <= 1; i++)
{
q_e.push(pair(x + i, y + j));
q_e.push(pair(x + i, y + j));
for(int j = -1; j <=1; j++) {
if(i != 0 && j != 0)
q_e.push(pair(x + i, y + j));
}
}*/
}
}
//printf("%d %d\n", up_end, down_end);
unsigned long long int w_min = -1;
int w_min_counter = 0;
int a, b;
for(int i = 0; i < k; i++) {
scanf("%d %d", &a, &b);
unsigned long long int time = ((unsigned long long) a) * up_end + ((unsigned long long) b) * down_end;
if (time < w_min) {
w_min = time;
w_min_counter = 1;
} else if (time == w_min) {
w_min_counter++;
}
}
printf("%lld %d\n", w_min, w_min_counter);
//printf("%s\n",field[i]);
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 78 79 80 81 | #include <cstdio> #include <queue> #include <utility> #include <tuple> using namespace std; const int NMAX = 2000 + 7; int n, m, k; char field[NMAX][NMAX]; queue<tuple<int, int, int, int> > q_e; int main() { int up_end = -1, down_end = -1; scanf("%d %d %d", &n, &m, &k); for (int i = 0; i < n; i++) scanf("%s", field[i]); q_e.push(make_tuple(0, 0, 0, 0)); while(!q_e.empty()) { tuple<int, int, int, int> p = q_e.front(); int x = get<0>(p), y = get<1>(p); int up = get<2>(p), down = get<3>(p); q_e.pop(); // printf("%d %d\n", x, y); if (0 <= x && x < n && 0 <= y && y < m && field[x][y] == '.') { field[x][y] = 'O'; // printf("|| %d %d %d %d || \n", x, y, up, down); if(x == n - 1 && y == m - 1) { up_end = up; down_end = down; break; } if (0 < x) q_e.push(make_tuple(x - 1, y, up, down + 1)); if (x < n - 1) q_e.push(make_tuple(x + 1, y, up + 1, down)); if (0 < y) q_e.push(make_tuple(x, y - 1, up, down + 1)); if (y < m - 1) q_e.push(make_tuple(x, y + 1, up + 1, down)); /*for (int i = -1; i <= 1; i++) { q_e.push(pair(x + i, y + j)); q_e.push(pair(x + i, y + j)); for(int j = -1; j <=1; j++) { if(i != 0 && j != 0) q_e.push(pair(x + i, y + j)); } }*/ } } //printf("%d %d\n", up_end, down_end); unsigned long long int w_min = -1; int w_min_counter = 0; int a, b; for(int i = 0; i < k; i++) { scanf("%d %d", &a, &b); unsigned long long int time = ((unsigned long long) a) * up_end + ((unsigned long long) b) * down_end; if (time < w_min) { w_min = time; w_min_counter = 1; } else if (time == w_min) { w_min_counter++; } } printf("%lld %d\n", w_min, w_min_counter); //printf("%s\n",field[i]); return 0; } |
English