#include<iostream> #include<vector> #include<utility> using namespace std; long long BFS(vector<vector<long long>>& odl, vector<vector<char>>& plansza, long long dlug, long long szer) { vector<long long> kolejka; long long a = 2002 + 1; kolejka.push_back(a); odl[1][1] = 0; long long j = 0; long long k = 0; long long x; long long y; while (kolejka.size() > j) { x = kolejka[j] / 2002; y = kolejka[j] % 2002; if (x == dlug && y == szer) return odl[x][y]; else { if ((plansza[x + 1][y] != 'X') && (odl[x + 1][y] == 5000000)) { kolejka.push_back((2002 * (x + 1)) + y); odl[x + 1][y] = odl[x][y] + 1; } if ((plansza[x][y + 1] != 'X') && (odl[x][y + 1] == 5000000)) { kolejka.push_back((2002 * (x)) + y + 1); odl[x][y + 1] = odl[x][y] + 1; } if ((plansza[x - 1][y] != 'X') && (odl[x - 1][y] == 5000000)) { kolejka.push_back((2002 * (x - 1)) + y); odl[x - 1][y] = odl[x][y] + 1; } if ((plansza[x][y - 1] != 'X') && (odl[x][y - 1] == 5000000)) { kolejka.push_back((2002 * (x)) + y - 1); odl[x][y - 1] = odl[x][y] + 1; } } j++; } return 5000000; } int main() { long long gora; long long dol; long long dlug; long long szer; long long r; long long ilo; long long min = 5000000000000000; long long najszybsi = 0; long long wynik; vector<vector<char>>plansza; vector<char>pomocniczy; char pom; vector<vector<long long>>odleglosc; vector<long long> pomo; cin >> dlug >> szer>>ilo; for (long long k = 0; k < szer + 2; k++) { pomocniczy.push_back('X'); pomo.push_back(5000000); } plansza.push_back(pomocniczy); odleglosc.push_back(pomo); pomocniczy.clear(); pomo.clear(); for (long long j = 0; j < dlug; j++) { pomocniczy.push_back('X'); pomo.push_back(5000000); for (long long k = 0; k < szer; k++) { cin >> pom; pomocniczy.push_back(pom); pomo.push_back(5000000); } pomocniczy.push_back('X'); pomo.push_back(5000000); plansza.push_back(pomocniczy); odleglosc.push_back(pomo); pomocniczy.clear(); pomo.clear(); } for (long long k = 0; k < szer + 2; k++) { pomocniczy.push_back('X'); pomo.push_back(5000000); } plansza.push_back(pomocniczy); odleglosc.push_back(pomo); pomocniczy.clear(); pomo.clear(); r = (((BFS(odleglosc, plansza,dlug,szer)-dlug)-szer)+2)/2; for (long long i = 0; i < ilo; i++) { cin >> gora >> dol; wynik= (r * (gora + dol)) + ((dlug + szer - 2) * gora); if (wynik < min) { min = wynik; najszybsi = 1; } else if (wynik == min) najszybsi++; } cout << min <<" "<< najszybsi; 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include<iostream> #include<vector> #include<utility> using namespace std; long long BFS(vector<vector<long long>>& odl, vector<vector<char>>& plansza, long long dlug, long long szer) { vector<long long> kolejka; long long a = 2002 + 1; kolejka.push_back(a); odl[1][1] = 0; long long j = 0; long long k = 0; long long x; long long y; while (kolejka.size() > j) { x = kolejka[j] / 2002; y = kolejka[j] % 2002; if (x == dlug && y == szer) return odl[x][y]; else { if ((plansza[x + 1][y] != 'X') && (odl[x + 1][y] == 5000000)) { kolejka.push_back((2002 * (x + 1)) + y); odl[x + 1][y] = odl[x][y] + 1; } if ((plansza[x][y + 1] != 'X') && (odl[x][y + 1] == 5000000)) { kolejka.push_back((2002 * (x)) + y + 1); odl[x][y + 1] = odl[x][y] + 1; } if ((plansza[x - 1][y] != 'X') && (odl[x - 1][y] == 5000000)) { kolejka.push_back((2002 * (x - 1)) + y); odl[x - 1][y] = odl[x][y] + 1; } if ((plansza[x][y - 1] != 'X') && (odl[x][y - 1] == 5000000)) { kolejka.push_back((2002 * (x)) + y - 1); odl[x][y - 1] = odl[x][y] + 1; } } j++; } return 5000000; } int main() { long long gora; long long dol; long long dlug; long long szer; long long r; long long ilo; long long min = 5000000000000000; long long najszybsi = 0; long long wynik; vector<vector<char>>plansza; vector<char>pomocniczy; char pom; vector<vector<long long>>odleglosc; vector<long long> pomo; cin >> dlug >> szer>>ilo; for (long long k = 0; k < szer + 2; k++) { pomocniczy.push_back('X'); pomo.push_back(5000000); } plansza.push_back(pomocniczy); odleglosc.push_back(pomo); pomocniczy.clear(); pomo.clear(); for (long long j = 0; j < dlug; j++) { pomocniczy.push_back('X'); pomo.push_back(5000000); for (long long k = 0; k < szer; k++) { cin >> pom; pomocniczy.push_back(pom); pomo.push_back(5000000); } pomocniczy.push_back('X'); pomo.push_back(5000000); plansza.push_back(pomocniczy); odleglosc.push_back(pomo); pomocniczy.clear(); pomo.clear(); } for (long long k = 0; k < szer + 2; k++) { pomocniczy.push_back('X'); pomo.push_back(5000000); } plansza.push_back(pomocniczy); odleglosc.push_back(pomo); pomocniczy.clear(); pomo.clear(); r = (((BFS(odleglosc, plansza,dlug,szer)-dlug)-szer)+2)/2; for (long long i = 0; i < ilo; i++) { cin >> gora >> dol; wynik= (r * (gora + dol)) + ((dlug + szer - 2) * gora); if (wynik < min) { min = wynik; najszybsi = 1; } else if (wynik == min) najszybsi++; } cout << min <<" "<< najszybsi; return 0; } |