#include <stdio.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <climits> using namespace std; struct stan { int n; int m; int wyzej; int nizej; }; int main() { // ios_base::sync_with_stdio(false); // cin.tie(NULL); int n{}, m{}, k{}; cin >> n >> m >> k; char gora[2000][2000]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf(" %c", &gora[i][j]); } } long long wyzej = 0; long long nizej = 0; int dx[]{0, 0, -1, 1}; int dy[]{-1, 1, 0, 0}; queue<stan> kolejka{}; kolejka.push(stan{0,0,0,0}); gora[0][0] = 'v'; while (kolejka.size()) { auto s = kolejka.front(); kolejka.pop(); if (s.n == n-1 && s.m == m-1) { wyzej = s.wyzej; nizej = s.nizej; break; } for (int i = 0; i < 4; i++) { int nn = s.n + dx[i]; int nm = s.m + dy[i]; if (nn >= 0 && nn < n && nm >= 0 && nm < m && gora[nn][nm] == '.') { gora[nn][nm] = 'v'; int nwyzej = s.wyzej; int nnizej = s.nizej; if (i%2 == 0) { nnizej++; } else { nwyzej++; } kolejka.push(stan{nn,nm,nwyzej,nnizej}); } } } long long najszybszy = __LONG_LONG_MAX__; int ile = 0; int wchodzenie{}, schodzenie{}; for (int i = 0; i < k; i++) { scanf(" %i", &wchodzenie); scanf(" %i", &schodzenie); long long suma = wyzej*wchodzenie + nizej*schodzenie; if (suma == najszybszy) { ile++; } else if (suma < najszybszy) { najszybszy = suma; ile = 1; } } cout << najszybszy << " " << ile << "\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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include <stdio.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <climits> using namespace std; struct stan { int n; int m; int wyzej; int nizej; }; int main() { // ios_base::sync_with_stdio(false); // cin.tie(NULL); int n{}, m{}, k{}; cin >> n >> m >> k; char gora[2000][2000]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf(" %c", &gora[i][j]); } } long long wyzej = 0; long long nizej = 0; int dx[]{0, 0, -1, 1}; int dy[]{-1, 1, 0, 0}; queue<stan> kolejka{}; kolejka.push(stan{0,0,0,0}); gora[0][0] = 'v'; while (kolejka.size()) { auto s = kolejka.front(); kolejka.pop(); if (s.n == n-1 && s.m == m-1) { wyzej = s.wyzej; nizej = s.nizej; break; } for (int i = 0; i < 4; i++) { int nn = s.n + dx[i]; int nm = s.m + dy[i]; if (nn >= 0 && nn < n && nm >= 0 && nm < m && gora[nn][nm] == '.') { gora[nn][nm] = 'v'; int nwyzej = s.wyzej; int nnizej = s.nizej; if (i%2 == 0) { nnizej++; } else { nwyzej++; } kolejka.push(stan{nn,nm,nwyzej,nnizej}); } } } long long najszybszy = __LONG_LONG_MAX__; int ile = 0; int wchodzenie{}, schodzenie{}; for (int i = 0; i < k; i++) { scanf(" %i", &wchodzenie); scanf(" %i", &schodzenie); long long suma = wyzej*wchodzenie + nizej*schodzenie; if (suma == najszybszy) { ile++; } else if (suma < najszybszy) { najszybszy = suma; ile = 1; } } cout << najszybszy << " " << ile << "\n"; } |