#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"; } |
English