#include <bits/stdc++.h> #define gc getchar #define gcu getchar_unlocked #define fi first #define se second #define pb push_back #define mod ((ll)1e9 + 7) typedef long long ll; using namespace std; //=============================================================================================== int n, m, k; pair<ll, ll> ans = {LLONG_MAX, LLONG_MAX}; bool odw[3009][3009]; char c[3009][3009]; int odl[3009][3009]; void bfs(void); //=============================================================================================== int main() { scanf("%d %d %d", &n, &m, &k); for (int i = 1; i <= n; i++) { gc(); for (int j = 1; j <= m; j++) c[i][j] = gc(), odl[i][j] = INT_MAX; } bfs(); ll asd = n + m - 2; asd += (odl[n][m] - asd) / 2; for (ll i = 0, tempa, tempb; i < k; i++) { scanf("%lld %lld", &tempa, &tempb); if (asd * tempa + ((ll)odl[n][m] - asd) * tempb == ans.fi) ans.se++; if (asd * tempa + ((ll)odl[n][m] - asd) * tempb < ans.fi) ans = {asd * tempa + ((ll)odl[n][m] - asd) * tempb, 1}; } printf("%lld %lld\n", ans.fi, ans.se); } //=============================================================================================== // 5 7 1 // ......X // X.X..X. // ..X.X.X // .X.X... // .....X. // 2 1 // 2 5 4 // .X... // ...X. // 2 1 // 2 2 // 1 7 // 2 1 void bfs(void) { priority_queue<pair<int, pair<int, int>>> pq; pq.push({0, {1, 1}}); odl[1][1] = 0; int x, y; while (!pq.empty()) { x = pq.top().se.fi; y = pq.top().se.se; pq.pop(); if (odw[x][y]) continue; if (c[x][y + 1] == '.' && odl[x][y] + 1 < odl[x][y + 1]) pq.push({odl[x][y] + 1, {x, y + 1}}), odl[x][y + 1] = odl[x][y] + 1; if (c[x][y - 1] == '.' && odl[x][y] + 1 < odl[x][y - 1]) pq.push({odl[x][y] + 1, {x, y - 1}}), odl[x][y - 1] = odl[x][y] + 1; if (c[x + 1][y] == '.' && odl[x][y] + 1 < odl[x + 1][y]) pq.push({odl[x][y] + 1, {x + 1, y}}), odl[x + 1][y] = odl[x][y] + 1; if (c[x - 1][y] == '.' && odl[x][y] + 1 < odl[x - 1][y]) pq.push({odl[x][y] + 1, {x - 1, y}}), odl[x - 1][y] = odl[x][y] + 1; odw[x][y] = 1; } }
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 | #include <bits/stdc++.h> #define gc getchar #define gcu getchar_unlocked #define fi first #define se second #define pb push_back #define mod ((ll)1e9 + 7) typedef long long ll; using namespace std; //=============================================================================================== int n, m, k; pair<ll, ll> ans = {LLONG_MAX, LLONG_MAX}; bool odw[3009][3009]; char c[3009][3009]; int odl[3009][3009]; void bfs(void); //=============================================================================================== int main() { scanf("%d %d %d", &n, &m, &k); for (int i = 1; i <= n; i++) { gc(); for (int j = 1; j <= m; j++) c[i][j] = gc(), odl[i][j] = INT_MAX; } bfs(); ll asd = n + m - 2; asd += (odl[n][m] - asd) / 2; for (ll i = 0, tempa, tempb; i < k; i++) { scanf("%lld %lld", &tempa, &tempb); if (asd * tempa + ((ll)odl[n][m] - asd) * tempb == ans.fi) ans.se++; if (asd * tempa + ((ll)odl[n][m] - asd) * tempb < ans.fi) ans = {asd * tempa + ((ll)odl[n][m] - asd) * tempb, 1}; } printf("%lld %lld\n", ans.fi, ans.se); } //=============================================================================================== // 5 7 1 // ......X // X.X..X. // ..X.X.X // .X.X... // .....X. // 2 1 // 2 5 4 // .X... // ...X. // 2 1 // 2 2 // 1 7 // 2 1 void bfs(void) { priority_queue<pair<int, pair<int, int>>> pq; pq.push({0, {1, 1}}); odl[1][1] = 0; int x, y; while (!pq.empty()) { x = pq.top().se.fi; y = pq.top().se.se; pq.pop(); if (odw[x][y]) continue; if (c[x][y + 1] == '.' && odl[x][y] + 1 < odl[x][y + 1]) pq.push({odl[x][y] + 1, {x, y + 1}}), odl[x][y + 1] = odl[x][y] + 1; if (c[x][y - 1] == '.' && odl[x][y] + 1 < odl[x][y - 1]) pq.push({odl[x][y] + 1, {x, y - 1}}), odl[x][y - 1] = odl[x][y] + 1; if (c[x + 1][y] == '.' && odl[x][y] + 1 < odl[x + 1][y]) pq.push({odl[x][y] + 1, {x + 1, y}}), odl[x + 1][y] = odl[x][y] + 1; if (c[x - 1][y] == '.' && odl[x][y] + 1 < odl[x - 1][y]) pq.push({odl[x][y] + 1, {x - 1, y}}), odl[x - 1][y] = odl[x][y] + 1; odw[x][y] = 1; } } |