#include <bits/stdc++.h> using namespace std; const int N = 2 * 1000 + 7; const int M = 1000 * 1000 + 7; typedef long long ll; ll odlp[N][N], odlz[N][N]; int o[N][N], czy[N][N]; pair<ll, ll> p[M]; queue<pair<int, int>> kol; vector<pair<int, int>> roza; void BFS(int n, int m) { int i, j, ni, nj, k; o[1][1] = 1; odlp[1][1] = 0; odlz[1][1] = 0; kol.push(make_pair(1, 1)); while(kol.size() > 0) { i = kol.front().first; j = kol.front().second; //cout << i << " " << j << " " << odlp[i][j] << " " << odlz[i][j] << "\n"; kol.pop(); for(k = 0; k < (int)roza.size(); ++k) { ni = roza[k].first + i; nj = roza[k].second + j; if(ni > n || ni < 1 || nj > m || nj < 1 || czy[ni][nj] == 1 || o[ni][nj] == 1) continue; odlp[ni][nj] = odlp[i][j]; odlz[ni][nj] = odlz[i][j]; o[ni][nj] = 1; if(roza[k].first == 1 || roza[k].second == 1) ++odlp[ni][nj]; else ++odlz[ni][nj]; kol.push(make_pair(ni, nj)); } } } void Wynik(int k, int n, int m) { int i, il; ll min; il = 0; min = 100000000000000000ll; for(i = 1; i <= k; ++i) { if(odlp[n][m] * p[i].first + odlz[n][m] * p[i].second == min) ++il; if(odlp[n][m] * p[i].first + odlz[n][m] * p[i].second < min) { min = odlp[n][m] * p[i].first + odlz[n][m] * p[i].second; il = 1; } } cout << min << " " << il << "\n"; } void WczytajLiczby(int &n, int &m, int &k) { int i, j; char z; cin >> n >> m >> k; for(i = 1; i <= n; ++i) { for(j = 1; j <= m; ++j) { cin >> z; if(z == 'X') czy[i][j] = 1; } } for(i = 1; i <= k; ++i) cin >> p[i].first >> p[i].second; roza.push_back(make_pair(1, 0)); roza.push_back(make_pair(0, 1)); roza.push_back(make_pair(-1, 0)); roza.push_back(make_pair(0, -1)); } void Wycieczka() { int n, m, k; WczytajLiczby(n, m, k); BFS(n, m); Wynik(k, n, m); } int main () { ios_base::sync_with_stdio(false); cin.tie(nullptr); Wycieczka(); 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include <bits/stdc++.h> using namespace std; const int N = 2 * 1000 + 7; const int M = 1000 * 1000 + 7; typedef long long ll; ll odlp[N][N], odlz[N][N]; int o[N][N], czy[N][N]; pair<ll, ll> p[M]; queue<pair<int, int>> kol; vector<pair<int, int>> roza; void BFS(int n, int m) { int i, j, ni, nj, k; o[1][1] = 1; odlp[1][1] = 0; odlz[1][1] = 0; kol.push(make_pair(1, 1)); while(kol.size() > 0) { i = kol.front().first; j = kol.front().second; //cout << i << " " << j << " " << odlp[i][j] << " " << odlz[i][j] << "\n"; kol.pop(); for(k = 0; k < (int)roza.size(); ++k) { ni = roza[k].first + i; nj = roza[k].second + j; if(ni > n || ni < 1 || nj > m || nj < 1 || czy[ni][nj] == 1 || o[ni][nj] == 1) continue; odlp[ni][nj] = odlp[i][j]; odlz[ni][nj] = odlz[i][j]; o[ni][nj] = 1; if(roza[k].first == 1 || roza[k].second == 1) ++odlp[ni][nj]; else ++odlz[ni][nj]; kol.push(make_pair(ni, nj)); } } } void Wynik(int k, int n, int m) { int i, il; ll min; il = 0; min = 100000000000000000ll; for(i = 1; i <= k; ++i) { if(odlp[n][m] * p[i].first + odlz[n][m] * p[i].second == min) ++il; if(odlp[n][m] * p[i].first + odlz[n][m] * p[i].second < min) { min = odlp[n][m] * p[i].first + odlz[n][m] * p[i].second; il = 1; } } cout << min << " " << il << "\n"; } void WczytajLiczby(int &n, int &m, int &k) { int i, j; char z; cin >> n >> m >> k; for(i = 1; i <= n; ++i) { for(j = 1; j <= m; ++j) { cin >> z; if(z == 'X') czy[i][j] = 1; } } for(i = 1; i <= k; ++i) cin >> p[i].first >> p[i].second; roza.push_back(make_pair(1, 0)); roza.push_back(make_pair(0, 1)); roza.push_back(make_pair(-1, 0)); roza.push_back(make_pair(0, -1)); } void Wycieczka() { int n, m, k; WczytajLiczby(n, m, k); BFS(n, m); Wynik(k, n, m); } int main () { ios_base::sync_with_stdio(false); cin.tie(nullptr); Wycieczka(); return 0; } |