#include <cstdio> #include <vector> #include <algorithm> #include <iostream> #include <queue> using namespace std; #define f first #define s second const int MAXN = 2e3 + 13; const int INF = 1e9 + 3; const long long INF2 = 1e18 + 3; pair<int, int> tab[4] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; int dp[MAXN][MAXN]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m, k; int x, y; pair<int, int> p; char ch; cin >> n >> m >> k; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> ch; if (ch == '.') dp[i][j] = INF; } } dp[1][1] = 0; queue<pair<int, int> > q; q.push({1, 1}); while (!q.empty()) { p = q.front(); q.pop(); for (auto &it:tab) { x = p.f + it.f; y = p.s + it.s; if (dp[x][y] > dp[p.f][p.s] + 1) { dp[x][y] = dp[p.f][p.s] + 1; q.push({x, y}); } } } long long a, b, ans = INF2; long long c = n + m - 2; long long d = (dp[n][m] - c) / 2; long long sum; int cnt = 0; while (k--) { cin >> a >> b; sum = a * c + (a + b) * d; if (sum < ans) { ans = sum; cnt = 1; } else if (sum == ans) cnt++; } cout << ans << ' ' << cnt; 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 | #include <cstdio> #include <vector> #include <algorithm> #include <iostream> #include <queue> using namespace std; #define f first #define s second const int MAXN = 2e3 + 13; const int INF = 1e9 + 3; const long long INF2 = 1e18 + 3; pair<int, int> tab[4] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}}; int dp[MAXN][MAXN]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n, m, k; int x, y; pair<int, int> p; char ch; cin >> n >> m >> k; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { cin >> ch; if (ch == '.') dp[i][j] = INF; } } dp[1][1] = 0; queue<pair<int, int> > q; q.push({1, 1}); while (!q.empty()) { p = q.front(); q.pop(); for (auto &it:tab) { x = p.f + it.f; y = p.s + it.s; if (dp[x][y] > dp[p.f][p.s] + 1) { dp[x][y] = dp[p.f][p.s] + 1; q.push({x, y}); } } } long long a, b, ans = INF2; long long c = n + m - 2; long long d = (dp[n][m] - c) / 2; long long sum; int cnt = 0; while (k--) { cin >> a >> b; sum = a * c + (a + b) * d; if (sum < ans) { ans = sum; cnt = 1; } else if (sum == ans) cnt++; } cout << ans << ' ' << cnt; return 0; } |