#include <bits/stdc++.h> using namespace std; #define N 2000 int odw[N][N]; int odl[N][N]; vector<pair<int,int>> graf[N][N]; pair<int,int> rodzic[N][N]; void BFS(pair<int, int> p) { odw[p.first][p.second]=1; queue<pair<int, int>> bfs; bfs.push(p); while (!bfs.empty()) { pair<int,int> x=bfs.front(); bfs.pop(); for (auto y: graf[x.first][x.second]) { if(!odw[y.first][y.second]) { odl[y.first][y.second]=odl[x.first][x.second]+1;; odw[y.first][y.second]=1; rodzic[y.first][y.second] = x; bfs.push(y); } } } } main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m, c; cin >> n >> m >> c; char z; bool tab[n][m]; for (int y = 0; y < n; ++y) { for (int x = 0; x < m; ++x) { cin >> z; if (z == '.') { tab[x][y] = true; if (y > 0) { if (tab[x][y-1]) { graf[x][y].push_back(pair<int, int>(x,y-1)); graf[x][y-1].push_back(pair<int, int>(x, y)); } } if (x > 0) { if (tab[x-1][y]) { graf[x][y].push_back(pair<int, int>(x-1,y)); graf[x-1][y].push_back(pair<int, int>(x,y)); } } } else tab[x][y] = false; } } BFS({0,0}); pair<int,int> a = {m-1, n-1}; pair<int,int> b; pair<long long, long long> droga = {0,0}; cout << m+n-2 << ' ' << odl[m-1][n-1] << '\n'; droga.first = m+n-2+(odl[m-1][n-1]-m-n+2)/2; droga.second = (odl[m-1][n-1]-m-n+2)/2; long long minimum = LLONG_MAX; int liczba = 0; long long g, d; long long czas; for (int i = 0; i < c; ++i) { cin >> g >> d; czas = d*droga.second + g*droga.first; if (czas < minimum) { liczba = 1; minimum = czas; } else if (czas == minimum) liczba++; } cout << minimum << ' ' << liczba; }
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 101 102 103 104 105 106 | #include <bits/stdc++.h> using namespace std; #define N 2000 int odw[N][N]; int odl[N][N]; vector<pair<int,int>> graf[N][N]; pair<int,int> rodzic[N][N]; void BFS(pair<int, int> p) { odw[p.first][p.second]=1; queue<pair<int, int>> bfs; bfs.push(p); while (!bfs.empty()) { pair<int,int> x=bfs.front(); bfs.pop(); for (auto y: graf[x.first][x.second]) { if(!odw[y.first][y.second]) { odl[y.first][y.second]=odl[x.first][x.second]+1;; odw[y.first][y.second]=1; rodzic[y.first][y.second] = x; bfs.push(y); } } } } main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, m, c; cin >> n >> m >> c; char z; bool tab[n][m]; for (int y = 0; y < n; ++y) { for (int x = 0; x < m; ++x) { cin >> z; if (z == '.') { tab[x][y] = true; if (y > 0) { if (tab[x][y-1]) { graf[x][y].push_back(pair<int, int>(x,y-1)); graf[x][y-1].push_back(pair<int, int>(x, y)); } } if (x > 0) { if (tab[x-1][y]) { graf[x][y].push_back(pair<int, int>(x-1,y)); graf[x-1][y].push_back(pair<int, int>(x,y)); } } } else tab[x][y] = false; } } BFS({0,0}); pair<int,int> a = {m-1, n-1}; pair<int,int> b; pair<long long, long long> droga = {0,0}; cout << m+n-2 << ' ' << odl[m-1][n-1] << '\n'; droga.first = m+n-2+(odl[m-1][n-1]-m-n+2)/2; droga.second = (odl[m-1][n-1]-m-n+2)/2; long long minimum = LLONG_MAX; int liczba = 0; long long g, d; long long czas; for (int i = 0; i < c; ++i) { cin >> g >> d; czas = d*droga.second + g*droga.first; if (czas < minimum) { liczba = 1; minimum = czas; } else if (czas == minimum) liczba++; } cout << minimum << ' ' << liczba; } |