#include <iostream> #include <algorithm> #include <queue> using namespace std; char znaki[4000007]; bool odwiedzone[4000007]; int odleglosci[4000007]; long long wyniki[1000007]; int n, m, k; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cin >> n >> m >> k; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cin >> znaki[i*m+j]; } } queue<int> q; q.push(0); while(q.empty() == false){ int w = q.front(); q.pop(); int d = odleglosci[w]; if(w%m != 0 && znaki[w-1] == '.' && (odwiedzone[w-1] == false || d+1 < odleglosci[w-1])){ odwiedzone[w-1] = true; odleglosci[w-1] = d+1; q.push(w-1); } if(w%m < m-1 && znaki[w+1] == '.' && (odwiedzone[w+1] == false || d+1 < odleglosci[w+1])){ odwiedzone[w+1] = true; odleglosci[w+1] = d+1; q.push(w+1); } if(w > m-1 && znaki[w-m] == '.' && (odwiedzone[w-m] == false || d+1 < odleglosci[w-m])){ odwiedzone[w-m] = true; odleglosci[w-m] = d+1; q.push(w-m); } if(w < (n-1)*m && znaki[w+m] == '.' && (odwiedzone[w+m] == false || d+1 < odleglosci[w+m])){ odwiedzone[w+m] = true; odleglosci[w+m] = d+1; q.push(w+m); } } long long minim = odleglosci[n*m-1]; long long wynik = 1000000000000000000; long long ile = 0; for(int i = 0; i < k; i++){ long long a, b; cin >> a >> b; long long w = (n+m-2)*a+(a+b)*((minim-n-m+2)/2); if(w < wynik){ wynik = w; ile = 1; } else{ if(w == wynik){ ile++; } } } cout << wynik << " " << ile; 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 | #include <iostream> #include <algorithm> #include <queue> using namespace std; char znaki[4000007]; bool odwiedzone[4000007]; int odleglosci[4000007]; long long wyniki[1000007]; int n, m, k; int main() { ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); cin >> n >> m >> k; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ cin >> znaki[i*m+j]; } } queue<int> q; q.push(0); while(q.empty() == false){ int w = q.front(); q.pop(); int d = odleglosci[w]; if(w%m != 0 && znaki[w-1] == '.' && (odwiedzone[w-1] == false || d+1 < odleglosci[w-1])){ odwiedzone[w-1] = true; odleglosci[w-1] = d+1; q.push(w-1); } if(w%m < m-1 && znaki[w+1] == '.' && (odwiedzone[w+1] == false || d+1 < odleglosci[w+1])){ odwiedzone[w+1] = true; odleglosci[w+1] = d+1; q.push(w+1); } if(w > m-1 && znaki[w-m] == '.' && (odwiedzone[w-m] == false || d+1 < odleglosci[w-m])){ odwiedzone[w-m] = true; odleglosci[w-m] = d+1; q.push(w-m); } if(w < (n-1)*m && znaki[w+m] == '.' && (odwiedzone[w+m] == false || d+1 < odleglosci[w+m])){ odwiedzone[w+m] = true; odleglosci[w+m] = d+1; q.push(w+m); } } long long minim = odleglosci[n*m-1]; long long wynik = 1000000000000000000; long long ile = 0; for(int i = 0; i < k; i++){ long long a, b; cin >> a >> b; long long w = (n+m-2)*a+(a+b)*((minim-n-m+2)/2); if(w < wynik){ wynik = w; ile = 1; } else{ if(w == wynik){ ile++; } } } cout << wynik << " " << ile; return 0; } |