#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; typedef pair<int, int> Coord; int n, m, k; int pack(int x, int y) { return x + m * y; } int main() { std::ios::sync_with_stdio(false); cin >> n >> m >> k; vector<string > world_map; string input; vector<int> ups(m * n, -1), downs(m * n, -1); ups[0] = downs[0] = 0; for(int i = 0; i < n; ++i) { // map cin >> input; world_map.push_back(input); } queue<Coord> q; q.push({0, 0}); Coord changes[] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; while(!q.empty()) { Coord node = q.front(); q.pop(); int x = node.first, y = node.second; int sup = ups[pack(x, y)], sdown = downs[pack(x, y)]; for(auto delta: changes) { int dx = delta.first, dy = delta.second; int xx = x + dx, yy = y + dy; if(xx < 0 || xx >= m || yy < 0 || yy >= n || world_map[yy][xx] == 'X' || ups[pack(xx, yy)] != -1 ) { continue; } int nups = sup + ((dx + dy) > 0 ? 1 : 0), ndowns = sdown + ((dx + dy) < 0 ? 1 : 0); ups[pack(xx, yy)] = nups; downs[pack(xx, yy)] = ndowns; q.push({xx, yy}); } } int up = ups[pack(m - 1, n - 1)], down = downs[pack(m - 1, n - 1)]; int a, b; vector<int> times; for(int i = 0; i < k; ++i) { // travellers cin >> a >> b; times.push_back(a * up + b * down); } sort(times.begin(), times.end()); int winners = 1; for(int i = 1; i < k; ++i) { if(times[i] == times[i - 1]) { ++winners; } else { break; } } cout << times[0] << " " << winners << endl; }
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 | #include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; typedef pair<int, int> Coord; int n, m, k; int pack(int x, int y) { return x + m * y; } int main() { std::ios::sync_with_stdio(false); cin >> n >> m >> k; vector<string > world_map; string input; vector<int> ups(m * n, -1), downs(m * n, -1); ups[0] = downs[0] = 0; for(int i = 0; i < n; ++i) { // map cin >> input; world_map.push_back(input); } queue<Coord> q; q.push({0, 0}); Coord changes[] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; while(!q.empty()) { Coord node = q.front(); q.pop(); int x = node.first, y = node.second; int sup = ups[pack(x, y)], sdown = downs[pack(x, y)]; for(auto delta: changes) { int dx = delta.first, dy = delta.second; int xx = x + dx, yy = y + dy; if(xx < 0 || xx >= m || yy < 0 || yy >= n || world_map[yy][xx] == 'X' || ups[pack(xx, yy)] != -1 ) { continue; } int nups = sup + ((dx + dy) > 0 ? 1 : 0), ndowns = sdown + ((dx + dy) < 0 ? 1 : 0); ups[pack(xx, yy)] = nups; downs[pack(xx, yy)] = ndowns; q.push({xx, yy}); } } int up = ups[pack(m - 1, n - 1)], down = downs[pack(m - 1, n - 1)]; int a, b; vector<int> times; for(int i = 0; i < k; ++i) { // travellers cin >> a >> b; times.push_back(a * up + b * down); } sort(times.begin(), times.end()); int winners = 1; for(int i = 1; i < k; ++i) { if(times[i] == times[i - 1]) { ++winners; } else { break; } } cout << times[0] << " " << winners << endl; } |