#include <bits/stdc++.h> using namespace std; bool mapa[2005][2005]; int dp[2005][2005]; bool odw[2005][2005]; int x[4] = {1,-1,0,0}; int y[4] = {0,0,1,-1}; int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n, m, k; cin >> n >> m >> k; for (int i = 1; i <= n; ++i){ for (int j = 1; j <= m; ++j){ char c; cin >> c; mapa[i][j] = (c == '.' ? true : false); } } for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) dp[i][j] = 1e9; dp[1][1] = 0; queue <pair<pair<int,int>,int>> Q; Q.push({{1,1},-1}); while (! Q.empty()){ int i = Q.front().first.first; int j = Q.front().first.second; int d = Q.front().second; Q.pop(); //cout << "(" << i << ", " << j << ")\n"; if (odw[i][j]) continue; dp[i][j] = d+1; odw[i][j] = true; for (int h = 0; h <= 3; ++h){ int ii = i+y[h]; int jj = j+x[h]; if (min(ii,jj) < 1 || ii > n || jj > m || odw[ii][jj] || !mapa[ii][jj]) continue; Q.push({{ii,jj},dp[i][j]}); } } long long downs = (dp[n][m]-n-m+2)/2; long long ups = n+m-2+downs; long long mint = 1e18; int cnt = 0; for (int i = 1; i <= k; ++i){ int a, b; cin >> a >> b; long long res = ups*a + downs*b; if (res < mint){ mint = res; cnt = 0; } if (res == mint) cnt++; } cout << mint << " " << cnt << "\n"; }
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 | #include <bits/stdc++.h> using namespace std; bool mapa[2005][2005]; int dp[2005][2005]; bool odw[2005][2005]; int x[4] = {1,-1,0,0}; int y[4] = {0,0,1,-1}; int main(){ ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); int n, m, k; cin >> n >> m >> k; for (int i = 1; i <= n; ++i){ for (int j = 1; j <= m; ++j){ char c; cin >> c; mapa[i][j] = (c == '.' ? true : false); } } for (int i = 1; i <= n; ++i) for (int j = 1; j <= m; ++j) dp[i][j] = 1e9; dp[1][1] = 0; queue <pair<pair<int,int>,int>> Q; Q.push({{1,1},-1}); while (! Q.empty()){ int i = Q.front().first.first; int j = Q.front().first.second; int d = Q.front().second; Q.pop(); //cout << "(" << i << ", " << j << ")\n"; if (odw[i][j]) continue; dp[i][j] = d+1; odw[i][j] = true; for (int h = 0; h <= 3; ++h){ int ii = i+y[h]; int jj = j+x[h]; if (min(ii,jj) < 1 || ii > n || jj > m || odw[ii][jj] || !mapa[ii][jj]) continue; Q.push({{ii,jj},dp[i][j]}); } } long long downs = (dp[n][m]-n-m+2)/2; long long ups = n+m-2+downs; long long mint = 1e18; int cnt = 0; for (int i = 1; i <= k; ++i){ int a, b; cin >> a >> b; long long res = ups*a + downs*b; if (res < mint){ mint = res; cnt = 0; } if (res == mint) cnt++; } cout << mint << " " << cnt << "\n"; } |