#include <iostream>
#include <map>
#include <queue>
#include <set>
char MAP[2000][2000];
int N = 0;
int M = 0;
int K = 0;
struct V {
V(short x, short y) : x(x), y(y) {}
bool operator<(const V &o) const {
return std::tie(x, y) < std::tie(o.x, o.y);
}
bool operator==(const V &o) const { return x == o.x && y == o.y; }
short x;
short y;
};
struct E {
E(V v, int a, int b) : v(v), a(a), b(b) {}
V v;
int a;
int b;
};
void wczytajMape() {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
char c = 0;
std::cin >> c;
MAP[i][j] = (c == '.' ? 1 : 0);
}
}
}
void rysujMape() {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < M; ++j) {
std::cout << int(MAP[i][j]);
}
std::cout << std::endl;
}
}
std::pair<int, int> znajdzNajkrotszaSciezke() {
std::queue<E> fifo;
std::vector<V> vec = {V(0, 0), V(0, 0), V(0, 0), V(0, 0)};
fifo.push(E(V(0, 0), 0, 0));
while (fifo.empty() == false) {
E e = fifo.front();
fifo.pop();
if (e.v == V(M - 1, N - 1)) {
return {e.a, e.b};
}
if (MAP[e.v.y][e.v.x] & 0b10) {
continue;
}
vec[0] = V(e.v.x - 1, e.v.y);
vec[1] = V(e.v.x + 1, e.v.y);
vec[2] = V(e.v.x, e.v.y - 1);
vec[3] = V(e.v.x, e.v.y + 1);
for (const auto &i : vec) {
if (i.x < 0 || i.x >= M || i.y < 0 || i.y >= N) {
continue;
}
if ((MAP[i.y][i.x] & 0b01) == 0) {
continue;
}
if (i.x < e.v.x || i.y < e.v.y) {
fifo.push(E(i, e.a, e.b + 1));
} else {
fifo.push(E(i, e.a + 1, e.b));
}
}
MAP[e.v.y][e.v.x] |= 0b10;
}
return {-1, -1};
}
int main() {
std::cin >> N;
std::cin >> M;
std::cin >> K;
wczytajMape();
// rysujMape();
//
auto p = znajdzNajkrotszaSciezke();
// printf("%d %d\n", p.first, p.second);
//
uint64_t min = std::numeric_limits<uint64_t>::max();
int count = 0;
for (int i = 0; i < K; ++i) {
uint64_t a = 0, b = 0;
std::cin >> a;
std::cin >> b;
uint64_t dlugosc = a * p.first + b * p.second;
if (dlugosc < min) {
min = dlugosc;
count = 1;
} else if (dlugosc == min) {
count++;
}
}
std::cout << min << " " << count << 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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | #include <iostream> #include <map> #include <queue> #include <set> char MAP[2000][2000]; int N = 0; int M = 0; int K = 0; struct V { V(short x, short y) : x(x), y(y) {} bool operator<(const V &o) const { return std::tie(x, y) < std::tie(o.x, o.y); } bool operator==(const V &o) const { return x == o.x && y == o.y; } short x; short y; }; struct E { E(V v, int a, int b) : v(v), a(a), b(b) {} V v; int a; int b; }; void wczytajMape() { for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { char c = 0; std::cin >> c; MAP[i][j] = (c == '.' ? 1 : 0); } } } void rysujMape() { for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { std::cout << int(MAP[i][j]); } std::cout << std::endl; } } std::pair<int, int> znajdzNajkrotszaSciezke() { std::queue<E> fifo; std::vector<V> vec = {V(0, 0), V(0, 0), V(0, 0), V(0, 0)}; fifo.push(E(V(0, 0), 0, 0)); while (fifo.empty() == false) { E e = fifo.front(); fifo.pop(); if (e.v == V(M - 1, N - 1)) { return {e.a, e.b}; } if (MAP[e.v.y][e.v.x] & 0b10) { continue; } vec[0] = V(e.v.x - 1, e.v.y); vec[1] = V(e.v.x + 1, e.v.y); vec[2] = V(e.v.x, e.v.y - 1); vec[3] = V(e.v.x, e.v.y + 1); for (const auto &i : vec) { if (i.x < 0 || i.x >= M || i.y < 0 || i.y >= N) { continue; } if ((MAP[i.y][i.x] & 0b01) == 0) { continue; } if (i.x < e.v.x || i.y < e.v.y) { fifo.push(E(i, e.a, e.b + 1)); } else { fifo.push(E(i, e.a + 1, e.b)); } } MAP[e.v.y][e.v.x] |= 0b10; } return {-1, -1}; } int main() { std::cin >> N; std::cin >> M; std::cin >> K; wczytajMape(); // rysujMape(); // auto p = znajdzNajkrotszaSciezke(); // printf("%d %d\n", p.first, p.second); // uint64_t min = std::numeric_limits<uint64_t>::max(); int count = 0; for (int i = 0; i < K; ++i) { uint64_t a = 0, b = 0; std::cin >> a; std::cin >> b; uint64_t dlugosc = a * p.first + b * p.second; if (dlugosc < min) { min = dlugosc; count = 1; } else if (dlugosc == min) { count++; } } std::cout << min << " " << count << std::endl; return 0; } |
English