#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <queue>
#include <array>
using namespace std;
#ifdef USE_CERR_LOG
#define LOG if (true) cerr
const bool LogEnabled = true;
#else
#define LOG if (false) cerr
const bool LogEnabled = false;
#endif
bool LogBigEnabled = true;
#ifdef USE_FILE_CIN
ifstream fin("wyc.in");
#define cin fin
#endif
typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
struct Tourist {
ll timeUp;
ll timeDown;
};
vector<string> mapa;
vector<Tourist> tourists;
int n, m, k;
void readData() {
ios_base::sync_with_stdio(false);
cin >> n >> m >> k;
mapa.resize(n);
tourists.resize(k);
for (int i = 0; i < n; i++) {
cin >> mapa[i];
}
for (int i = 0; i < k; i++) {
cin >> tourists[i].timeUp >> tourists[i].timeDown;
}
}
int shortestPath() {
vector<vector<bool>> visited;
typedef pair<int, int> Pos;
queue<Pos> que;
vector<Pos> diffs = {{-1, 0}, {0, -1}, {0, +1}, {+1, 0}};
vector<vector<int>> distances;
visited.resize(n);
distances.resize(n);
for (auto& v : visited) v.resize(m, false);
for (auto& d : distances) d.resize(m, 0);
que.push({0, 0});
visited[0][0] = true;
while (true) {
Pos head = que.front();
que.pop();
int distance = distances[head.first][head.second];
for (auto dif : diffs) {
Pos pos = {head.first + dif.first, head.second + dif.second};
if (pos.first < 0 || pos.first >= n || pos.second < 0 || pos.second >= m || visited[pos.first][pos.second] || mapa[pos.first][pos.second] == 'X') {
continue;
}
visited[pos.first][pos.second] = true;
distances[pos.first][pos.second] = distance + 1;
LOG << pos.first << "," << pos.second << ":" << distances[pos.first][pos.second] << " ";
que.push(pos);
if (pos.first == n-1 && pos.second == m-1) {
return distances[pos.first][pos.second];
}
}
}
}
void solve() {
int distance = shortestPath();
int base = m + n - 2;
int extras = (distance - base) / 2;
int ups = base + extras;
int downs = extras;
ll minTime = tourists[0].timeUp * ups + tourists[0].timeDown * downs;
for (auto& t : tourists) {
minTime = min(minTime, t.timeUp * ups + t.timeDown * downs);
}
int count = 0;
for (auto& t : tourists) {
if (t.timeUp * ups + t.timeDown * downs == minTime) {
count ++;
}
}
cout << minTime << ' ' << count;
}
int main() {
readData();
solve();
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 | #include <iostream> #include <fstream> #include <vector> #include <string> #include <queue> #include <array> using namespace std; #ifdef USE_CERR_LOG #define LOG if (true) cerr const bool LogEnabled = true; #else #define LOG if (false) cerr const bool LogEnabled = false; #endif bool LogBigEnabled = true; #ifdef USE_FILE_CIN ifstream fin("wyc.in"); #define cin fin #endif typedef unsigned uint; typedef long long ll; typedef unsigned long long ull; struct Tourist { ll timeUp; ll timeDown; }; vector<string> mapa; vector<Tourist> tourists; int n, m, k; void readData() { ios_base::sync_with_stdio(false); cin >> n >> m >> k; mapa.resize(n); tourists.resize(k); for (int i = 0; i < n; i++) { cin >> mapa[i]; } for (int i = 0; i < k; i++) { cin >> tourists[i].timeUp >> tourists[i].timeDown; } } int shortestPath() { vector<vector<bool>> visited; typedef pair<int, int> Pos; queue<Pos> que; vector<Pos> diffs = {{-1, 0}, {0, -1}, {0, +1}, {+1, 0}}; vector<vector<int>> distances; visited.resize(n); distances.resize(n); for (auto& v : visited) v.resize(m, false); for (auto& d : distances) d.resize(m, 0); que.push({0, 0}); visited[0][0] = true; while (true) { Pos head = que.front(); que.pop(); int distance = distances[head.first][head.second]; for (auto dif : diffs) { Pos pos = {head.first + dif.first, head.second + dif.second}; if (pos.first < 0 || pos.first >= n || pos.second < 0 || pos.second >= m || visited[pos.first][pos.second] || mapa[pos.first][pos.second] == 'X') { continue; } visited[pos.first][pos.second] = true; distances[pos.first][pos.second] = distance + 1; LOG << pos.first << "," << pos.second << ":" << distances[pos.first][pos.second] << " "; que.push(pos); if (pos.first == n-1 && pos.second == m-1) { return distances[pos.first][pos.second]; } } } } void solve() { int distance = shortestPath(); int base = m + n - 2; int extras = (distance - base) / 2; int ups = base + extras; int downs = extras; ll minTime = tourists[0].timeUp * ups + tourists[0].timeDown * downs; for (auto& t : tourists) { minTime = min(minTime, t.timeUp * ups + t.timeDown * downs); } int count = 0; for (auto& t : tourists) { if (t.timeUp * ups + t.timeDown * downs == minTime) { count ++; } } cout << minTime << ' ' << count; } int main() { readData(); solve(); return 0; } |
English