#include <bits/stdc++.h> typedef long long ll; #define MAXN 2007 using namespace std; char tab[MAXN][MAXN]; bool vis[MAXN][MAXN][2]; int n, m, k; ll res, a, b, best, my_time; deque<pair<pair<int, int>, int>> dist; pair<pair<int, int>, int> current; pair<int, int> nnext; int up[][2] = {{0, 1}, {1, 0}}; int down[][2] = {{-1, 0}, {0, -1}}; inline bool inside(const pair<int, int> &x, const int &move){ return x.first >= 0 && x.second >= 0 && x.first < n && x.second < m && !vis[x.first][x.second][move]; } int main(){ scanf("%d%d%d", &n, &m, &k); for(int i = 0; i < n; i++){ scanf("%s", tab[i]); for(int j = 0; j <m ;j ++){ if(tab[i][j] == 'X'){ vis[i][j][0] = true; vis[i][j][1] = true; } } } dist.push_back(make_pair(make_pair(0, 0), 0)); vis[0][0][0] = true; vis[0][0][1] = true; while(!dist.empty()){ current = dist.front(); if (current.first == make_pair(n-1, m-1)){ break; } dist.pop_front(); for (int i = 0; i < 2; i++){ nnext = current.first; nnext.first += up[i][0]; nnext.second += up[i][1]; if (inside(nnext, 0)){ dist.push_front(make_pair(nnext, current.second)); vis[nnext.first][nnext.second][0] = true; } } for (int i = 0; i < 2; i++){ nnext = current.first; nnext.first += down[i][0]; nnext.second += down[i][1]; if (inside(nnext, 1)){ dist.push_back(make_pair(nnext, current.second + 1)); vis[nnext.first][nnext.second][1] = true; } } } best = 100000000LL * 1000000000LL; while(k--){ scanf("%lld%lld", &a, &b); my_time = a * (ll)(current.second + n + m - 2) + b * current.second; if (my_time < best) { best = my_time; res = 0ll; } if (my_time == best){ res++; } } printf("%lld %lld\n", best, res); }
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 | #include <bits/stdc++.h> typedef long long ll; #define MAXN 2007 using namespace std; char tab[MAXN][MAXN]; bool vis[MAXN][MAXN][2]; int n, m, k; ll res, a, b, best, my_time; deque<pair<pair<int, int>, int>> dist; pair<pair<int, int>, int> current; pair<int, int> nnext; int up[][2] = {{0, 1}, {1, 0}}; int down[][2] = {{-1, 0}, {0, -1}}; inline bool inside(const pair<int, int> &x, const int &move){ return x.first >= 0 && x.second >= 0 && x.first < n && x.second < m && !vis[x.first][x.second][move]; } int main(){ scanf("%d%d%d", &n, &m, &k); for(int i = 0; i < n; i++){ scanf("%s", tab[i]); for(int j = 0; j <m ;j ++){ if(tab[i][j] == 'X'){ vis[i][j][0] = true; vis[i][j][1] = true; } } } dist.push_back(make_pair(make_pair(0, 0), 0)); vis[0][0][0] = true; vis[0][0][1] = true; while(!dist.empty()){ current = dist.front(); if (current.first == make_pair(n-1, m-1)){ break; } dist.pop_front(); for (int i = 0; i < 2; i++){ nnext = current.first; nnext.first += up[i][0]; nnext.second += up[i][1]; if (inside(nnext, 0)){ dist.push_front(make_pair(nnext, current.second)); vis[nnext.first][nnext.second][0] = true; } } for (int i = 0; i < 2; i++){ nnext = current.first; nnext.first += down[i][0]; nnext.second += down[i][1]; if (inside(nnext, 1)){ dist.push_back(make_pair(nnext, current.second + 1)); vis[nnext.first][nnext.second][1] = true; } } } best = 100000000LL * 1000000000LL; while(k--){ scanf("%lld%lld", &a, &b); my_time = a * (ll)(current.second + n + m - 2) + b * current.second; if (my_time < best) { best = my_time; res = 0ll; } if (my_time == best){ res++; } } printf("%lld %lld\n", best, res); } |