#include <iostream>
#include <list>
#include <climits>
int findPath(char **map, int n, int m) {
int block = (int) 'X';
int steps = 0;
int s = 0;
int SIZE = m * n;
int *visited = new int[SIZE]{0};
int *distance = new int[SIZE]{0};
int *queue = new int[SIZE]{0};
visited[s] = true;
int queueFront = 0;
int queueBack = 1;
int rLimit = m - 1;
while (!visited[SIZE - 1] && queueFront < queueBack) {
s = queue[queueFront++];
int i = s / m;
int j = s % m;
if (j < rLimit && !visited[s + 1] && (int) map[i][j + 1] != block) {
visited[s + 1] = 1;
distance[s + 1] = distance[s] + 1;
queue[queueBack++] = s + 1;
}
if (i < n - 1 && !visited[s + m] && (int) map[i + 1][j] != block) {
visited[s + m] = 1;
distance[s + m] = distance[s] + 1;
queue[queueBack++] = s + m;
}
if (j > 0 && !visited[s - 1] && (int) map[i][j - 1] != block) {
visited[s - 1] = 1;
distance[s - 1] = distance[s] + 1;
queue[queueBack++] = s - 1;
}
if (i > 0 && !visited[s - m] && (int) map[i - 1][j] != block) {
visited[s - m] = 1;
distance[s - m] = distance[s] + 1;
queue[queueBack++] = s - m;
}
steps++;
}
return distance[SIZE - 1];
}
int main() {
std::ios_base::sync_with_stdio(0);
int n, m, k;
std::cin >> n >> m >> k;
auto map = new char *[n];
for (int i = 0; i < n; i++) {
map[i] = new char[m];
std::cin >> map[i];
}
long long distance = findPath(map, n, m);
long long minPath = n + m - 2;
long long overhead = (distance - minPath) / 2;
long long costUp;
long long costDown;
long long min = LLONG_MAX;
int minCount = 0;
for (int i = 0; i < k; i++) {
std::cin >> costUp >> costDown;
long long cost = minPath * costUp;
cost += overhead * (costUp + costDown);
if (cost < min) {
min = cost;
minCount = 1;
} else if (cost == min) {
minCount += 1;
}
}
std::cout << min << " " << minCount << std::endl;
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 82 83 84 | #include <iostream> #include <list> #include <climits> int findPath(char **map, int n, int m) { int block = (int) 'X'; int steps = 0; int s = 0; int SIZE = m * n; int *visited = new int[SIZE]{0}; int *distance = new int[SIZE]{0}; int *queue = new int[SIZE]{0}; visited[s] = true; int queueFront = 0; int queueBack = 1; int rLimit = m - 1; while (!visited[SIZE - 1] && queueFront < queueBack) { s = queue[queueFront++]; int i = s / m; int j = s % m; if (j < rLimit && !visited[s + 1] && (int) map[i][j + 1] != block) { visited[s + 1] = 1; distance[s + 1] = distance[s] + 1; queue[queueBack++] = s + 1; } if (i < n - 1 && !visited[s + m] && (int) map[i + 1][j] != block) { visited[s + m] = 1; distance[s + m] = distance[s] + 1; queue[queueBack++] = s + m; } if (j > 0 && !visited[s - 1] && (int) map[i][j - 1] != block) { visited[s - 1] = 1; distance[s - 1] = distance[s] + 1; queue[queueBack++] = s - 1; } if (i > 0 && !visited[s - m] && (int) map[i - 1][j] != block) { visited[s - m] = 1; distance[s - m] = distance[s] + 1; queue[queueBack++] = s - m; } steps++; } return distance[SIZE - 1]; } int main() { std::ios_base::sync_with_stdio(0); int n, m, k; std::cin >> n >> m >> k; auto map = new char *[n]; for (int i = 0; i < n; i++) { map[i] = new char[m]; std::cin >> map[i]; } long long distance = findPath(map, n, m); long long minPath = n + m - 2; long long overhead = (distance - minPath) / 2; long long costUp; long long costDown; long long min = LLONG_MAX; int minCount = 0; for (int i = 0; i < k; i++) { std::cin >> costUp >> costDown; long long cost = minPath * costUp; cost += overhead * (costUp + costDown); if (cost < min) { min = cost; minCount = 1; } else if (cost == min) { minCount += 1; } } std::cout << min << " " << minCount << std::endl; return 0; } |
English