#include <iostream> #include <vector> #include <queue> using namespace std; typedef long long ll; struct pkt { int x, y; }; int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1}; int main() { ios_base::sync_with_stdio(0); int n, m, k; cin >> n >> m >> k; vector<string> a(n); for (int i = 0; i < n; ++i) cin >> a[i]; vector< vector<int> > odl(n, vector<int>(m, -1)); vector< vector<int> > dobre(n, vector<int>(m)); vector< vector<int> > zle(n, vector<int>(m)); queue<pkt> Q; Q.push({0, 0}); odl[0][0] = dobre[0][0] = zle[0][0] = 0; while (!Q.empty()) { pkt akt = Q.front(); Q.pop(); for (int i = 0; i < 4; ++i) { pkt nowy = {akt.x + dx[i], akt.y + dy[i]}; if (nowy.x >= 0 && nowy.x < n && nowy.y >= 0 && nowy.y < m && a[nowy.x][nowy.y] == '.' && odl[nowy.x][nowy.y] == -1) { odl[nowy.x][nowy.y] = odl[akt.x][akt.y] + 1; Q.push(nowy); if (i == 1 || i == 2) { dobre[nowy.x][nowy.y] = dobre[akt.x][akt.y] + 1; zle[nowy.x][nowy.y] = zle[akt.x][akt.y]; } else { dobre[nowy.x][nowy.y] = dobre[akt.x][akt.y]; zle[nowy.x][nowy.y] = zle[akt.x][akt.y] + 1; } } } } ll d = dobre[n - 1][m - 1], z = zle[n - 1][m - 1]; ll czas = -1, il = 0; for (int i = 0; i < k; ++i) { ll a, b; cin >> a >> b; if (czas == -1 || a * d + b * z < czas) { czas = a * d + b * z; il = 1; } else { if (a * d + b * z == czas) ++il; } } cout << czas << " " << il; 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 | #include <iostream> #include <vector> #include <queue> using namespace std; typedef long long ll; struct pkt { int x, y; }; int dx[] = {-1, 0, 1, 0}; int dy[] = {0, 1, 0, -1}; int main() { ios_base::sync_with_stdio(0); int n, m, k; cin >> n >> m >> k; vector<string> a(n); for (int i = 0; i < n; ++i) cin >> a[i]; vector< vector<int> > odl(n, vector<int>(m, -1)); vector< vector<int> > dobre(n, vector<int>(m)); vector< vector<int> > zle(n, vector<int>(m)); queue<pkt> Q; Q.push({0, 0}); odl[0][0] = dobre[0][0] = zle[0][0] = 0; while (!Q.empty()) { pkt akt = Q.front(); Q.pop(); for (int i = 0; i < 4; ++i) { pkt nowy = {akt.x + dx[i], akt.y + dy[i]}; if (nowy.x >= 0 && nowy.x < n && nowy.y >= 0 && nowy.y < m && a[nowy.x][nowy.y] == '.' && odl[nowy.x][nowy.y] == -1) { odl[nowy.x][nowy.y] = odl[akt.x][akt.y] + 1; Q.push(nowy); if (i == 1 || i == 2) { dobre[nowy.x][nowy.y] = dobre[akt.x][akt.y] + 1; zle[nowy.x][nowy.y] = zle[akt.x][akt.y]; } else { dobre[nowy.x][nowy.y] = dobre[akt.x][akt.y]; zle[nowy.x][nowy.y] = zle[akt.x][akt.y] + 1; } } } } ll d = dobre[n - 1][m - 1], z = zle[n - 1][m - 1]; ll czas = -1, il = 0; for (int i = 0; i < k; ++i) { ll a, b; cin >> a >> b; if (czas == -1 || a * d + b * z < czas) { czas = a * d + b * z; il = 1; } else { if (a * d + b * z == czas) ++il; } } cout << czas << " " << il; return 0; } |