#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define sz(x) (int)x.size()
#define cat(x) cerr << #x << " = " << x << endl
#define IOS cin.tie(0); ios_base::sync_with_stdio(0)
using ll = long long;
using namespace std;
const int N = 2100;
int dr[] = {1, 0, 0, -1};
int dc[] = {0, 1, -1, 0};
int dx[] = {0, 0, 1, 1};
int n, m, k, dis[N][N];
char s[N][N];
deque<pair<int, int>> q;
bool in(int r, int c) {
return 1 <= r && r <= n && 1 <= c && c <= m;
}
int main() {
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; ++i)
scanf("%s", s[i] + 1);
memset(dis, 0x3f, sizeof dis);
q.push_back({1, 1});
dis[1][1] = 0;
while (!q.empty()) {
auto [r, c] = q.front();
q.pop_front();
for (int i = 0; i < 4; ++i) {
int nr = r + dr[i];
int nc = c + dc[i];
if (!in(nr, nc) || s[nr][nc] == 'X') continue;
int ndis = dis[r][c] + dx[i];
if (ndis < dis[nr][nc]) {
dis[nr][nc] = ndis;
if (dx[i] == 0)
q.push_front({nr, nc});
else
q.push_back({nr, nc});
}
}
}
ll res = 1e18, cnt = 0;
while (k--) {
ll a, b;
scanf("%lld%lld", &a, &b);
ll cost = (n + m - 2 + dis[n][m]) * a + dis[n][m] * b;
if (cost < res) {
res = cost;
cnt = 0;
}
if (cost == res)
cnt++;
}
printf("%lld %lld\n", res, 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 | #include <bits/stdc++.h> #define pb push_back #define fi first #define se second #define sz(x) (int)x.size() #define cat(x) cerr << #x << " = " << x << endl #define IOS cin.tie(0); ios_base::sync_with_stdio(0) using ll = long long; using namespace std; const int N = 2100; int dr[] = {1, 0, 0, -1}; int dc[] = {0, 1, -1, 0}; int dx[] = {0, 0, 1, 1}; int n, m, k, dis[N][N]; char s[N][N]; deque<pair<int, int>> q; bool in(int r, int c) { return 1 <= r && r <= n && 1 <= c && c <= m; } int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; ++i) scanf("%s", s[i] + 1); memset(dis, 0x3f, sizeof dis); q.push_back({1, 1}); dis[1][1] = 0; while (!q.empty()) { auto [r, c] = q.front(); q.pop_front(); for (int i = 0; i < 4; ++i) { int nr = r + dr[i]; int nc = c + dc[i]; if (!in(nr, nc) || s[nr][nc] == 'X') continue; int ndis = dis[r][c] + dx[i]; if (ndis < dis[nr][nc]) { dis[nr][nc] = ndis; if (dx[i] == 0) q.push_front({nr, nc}); else q.push_back({nr, nc}); } } } ll res = 1e18, cnt = 0; while (k--) { ll a, b; scanf("%lld%lld", &a, &b); ll cost = (n + m - 2 + dis[n][m]) * a + dis[n][m] * b; if (cost < res) { res = cost; cnt = 0; } if (cost == res) cnt++; } printf("%lld %lld\n", res, cnt); return 0; } |
English