#include <iostream> #include <queue> constexpr int MAX_N = 2000; constexpr int MAX_ZNAJOMYCH = 1000000; int gora[MAX_ZNAJOMYCH], dol[MAX_ZNAJOMYCH]; bool tab[MAX_N+2][MAX_N+2]; std::pair<int, int> koszt[MAX_N+2][MAX_N+2]; void bfs() { std::queue<std::pair<int, int>> kolejka; tab[1][1] = false, koszt[1][1] = {0, 0}; kolejka.push({1, 1}); while(!kolejka.empty()) { int i = kolejka.front().first, j = kolejka.front().second; kolejka.pop(); if(tab[i][j+1]) { tab[i][j+1] = false, koszt[i][j+1] = {koszt[i][j].first+1, koszt[i][j].second}; kolejka.push({i, j+1}); } if(tab[i+1][j]) { tab[i+1][j] = false, koszt[i+1][j] = {koszt[i][j].first+1, koszt[i][j].second}; kolejka.push({i+1, j}); } if(tab[i][j-1]) { tab[i][j-1] = false, koszt[i][j-1] = {koszt[i][j].first, koszt[i][j].second+1}; kolejka.push({i, j-1}); } if(tab[i-1][j]) { tab[i-1][j] = false, koszt[i-1][j] = {koszt[i][j].first, koszt[i][j].second+1}; kolejka.push({i-1, j}); } } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int n, m, liczba_znajomych; std::cin >> n >> m >> liczba_znajomych; std::string str; for(int i = 1; i <= n; ++i) { std::cin >> str; for(int j = 1; j <= m; ++j) tab[i][j] = (str[j-1] == '.'); } bfs(); for(int i = 0; i < liczba_znajomych; ++i) std::cin >> gora[i] >> dol[i]; long long wynik = 0x7FFFFFFFFFFFFFFF, liczba_wynikow = 0; for(int i = 0; i < liczba_znajomych; ++i) { if((long long)gora[i]*koszt[n][m].first+(long long)dol[i]*koszt[n][m].second < wynik) { wynik = (long long)gora[i]*koszt[n][m].first+(long long)dol[i]*koszt[n][m].second; liczba_wynikow = 0; } if((long long)gora[i]*koszt[n][m].first+(long long)dol[i]*koszt[n][m].second == wynik) ++liczba_wynikow; } std::cout << wynik << ' ' << liczba_wynikow << '\n'; 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 75 76 77 78 79 | #include <iostream> #include <queue> constexpr int MAX_N = 2000; constexpr int MAX_ZNAJOMYCH = 1000000; int gora[MAX_ZNAJOMYCH], dol[MAX_ZNAJOMYCH]; bool tab[MAX_N+2][MAX_N+2]; std::pair<int, int> koszt[MAX_N+2][MAX_N+2]; void bfs() { std::queue<std::pair<int, int>> kolejka; tab[1][1] = false, koszt[1][1] = {0, 0}; kolejka.push({1, 1}); while(!kolejka.empty()) { int i = kolejka.front().first, j = kolejka.front().second; kolejka.pop(); if(tab[i][j+1]) { tab[i][j+1] = false, koszt[i][j+1] = {koszt[i][j].first+1, koszt[i][j].second}; kolejka.push({i, j+1}); } if(tab[i+1][j]) { tab[i+1][j] = false, koszt[i+1][j] = {koszt[i][j].first+1, koszt[i][j].second}; kolejka.push({i+1, j}); } if(tab[i][j-1]) { tab[i][j-1] = false, koszt[i][j-1] = {koszt[i][j].first, koszt[i][j].second+1}; kolejka.push({i, j-1}); } if(tab[i-1][j]) { tab[i-1][j] = false, koszt[i-1][j] = {koszt[i][j].first, koszt[i][j].second+1}; kolejka.push({i-1, j}); } } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); int n, m, liczba_znajomych; std::cin >> n >> m >> liczba_znajomych; std::string str; for(int i = 1; i <= n; ++i) { std::cin >> str; for(int j = 1; j <= m; ++j) tab[i][j] = (str[j-1] == '.'); } bfs(); for(int i = 0; i < liczba_znajomych; ++i) std::cin >> gora[i] >> dol[i]; long long wynik = 0x7FFFFFFFFFFFFFFF, liczba_wynikow = 0; for(int i = 0; i < liczba_znajomych; ++i) { if((long long)gora[i]*koszt[n][m].first+(long long)dol[i]*koszt[n][m].second < wynik) { wynik = (long long)gora[i]*koszt[n][m].first+(long long)dol[i]*koszt[n][m].second; liczba_wynikow = 0; } if((long long)gora[i]*koszt[n][m].first+(long long)dol[i]*koszt[n][m].second == wynik) ++liczba_wynikow; } std::cout << wynik << ' ' << liczba_wynikow << '\n'; return 0; } |