#include <bits/stdc++.h> using namespace std; queue<pair<pair<int, int>, int>> q; long long a, b, c,od[2002][2002],odl[2020][2020] ; string d[2002]; void dfs(int pozx, int pozy, int odli) { q.push(make_pair(make_pair(0, 0), 0)); while (q.size()) { pozx = q.front().first.first; pozy = q.front().first.second; odli = q.front().second; q.pop(); if (pozx != 0 && od[pozx - 1][pozy] == 0 && d[pozx - 1][pozy] == '.') { od[pozx - 1][pozy] = 1; odl[pozx - 1][pozy] = odli + 1; q.push(make_pair(make_pair(pozx - 1, pozy), odli + 1)); } if (pozy != 0 && od[pozx][pozy - 1] == 0 && d[pozx][pozy - 1] == '.') { od[pozx][pozy - 1] = 1; odl[pozx][pozy - 1] = odli + 1; q.push(make_pair(make_pair(pozx, pozy - 1), odli + 1)); } if (pozx < a - 1 && od[pozx + 1][pozy] == 0 && d[pozx + 1][pozy] == '.') { od[pozx + 1][pozy] = 1; odl[pozx + 1][pozy] = odli + 1; q.push(make_pair(make_pair(pozx + 1, pozy), odli + 1)); } if (pozy < b - 1 && od[pozx][pozy + 1] == 0 && d[pozx][pozy + 1] == '.') { od[pozx][pozy + 1] = 1; odl[pozx][pozy + 1] = odli + 1; q.push(make_pair(make_pair(pozx, pozy + 1), odli + 1)); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> a >> b >> c; for (int i = 0; i < a; i++) { cin >> d[i]; } dfs(0, 0, 0); long long int firstmoves = (odl[a - 1][b - 1] - (a - 1) - (b - 1)) / 2 + a - 1 + b - 1; long long int secondmoves = (odl[a - 1][b - 1] - (a - 1) - (b - 1)) / 2; long long int wyn = 1e18; long long int licz = 0; for (int i = 0; i < c; i++) { cin >> a >> b; if (firstmoves * a + secondmoves * b < wyn) { wyn = firstmoves * a + secondmoves * b; licz = 1; } else if (firstmoves * a + secondmoves * b == wyn) { licz++; } } cout << wyn << " " << licz << "\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 | #include <bits/stdc++.h> using namespace std; queue<pair<pair<int, int>, int>> q; long long a, b, c,od[2002][2002],odl[2020][2020] ; string d[2002]; void dfs(int pozx, int pozy, int odli) { q.push(make_pair(make_pair(0, 0), 0)); while (q.size()) { pozx = q.front().first.first; pozy = q.front().first.second; odli = q.front().second; q.pop(); if (pozx != 0 && od[pozx - 1][pozy] == 0 && d[pozx - 1][pozy] == '.') { od[pozx - 1][pozy] = 1; odl[pozx - 1][pozy] = odli + 1; q.push(make_pair(make_pair(pozx - 1, pozy), odli + 1)); } if (pozy != 0 && od[pozx][pozy - 1] == 0 && d[pozx][pozy - 1] == '.') { od[pozx][pozy - 1] = 1; odl[pozx][pozy - 1] = odli + 1; q.push(make_pair(make_pair(pozx, pozy - 1), odli + 1)); } if (pozx < a - 1 && od[pozx + 1][pozy] == 0 && d[pozx + 1][pozy] == '.') { od[pozx + 1][pozy] = 1; odl[pozx + 1][pozy] = odli + 1; q.push(make_pair(make_pair(pozx + 1, pozy), odli + 1)); } if (pozy < b - 1 && od[pozx][pozy + 1] == 0 && d[pozx][pozy + 1] == '.') { od[pozx][pozy + 1] = 1; odl[pozx][pozy + 1] = odli + 1; q.push(make_pair(make_pair(pozx, pozy + 1), odli + 1)); } } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> a >> b >> c; for (int i = 0; i < a; i++) { cin >> d[i]; } dfs(0, 0, 0); long long int firstmoves = (odl[a - 1][b - 1] - (a - 1) - (b - 1)) / 2 + a - 1 + b - 1; long long int secondmoves = (odl[a - 1][b - 1] - (a - 1) - (b - 1)) / 2; long long int wyn = 1e18; long long int licz = 0; for (int i = 0; i < c; i++) { cin >> a >> b; if (firstmoves * a + secondmoves * b < wyn) { wyn = firstmoves * a + secondmoves * b; licz = 1; } else if (firstmoves * a + secondmoves * b == wyn) { licz++; } } cout << wyn << " " << licz << "\n"; } |