#include <iostream>
#include <vector>
using namespace std;
const int ruchy[4][2] = { {1,0},{0,1},{-1,0},{0,-1} };
void ruch(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int r_gora, unsigned long long int r_dol, unsigned long long int roz_w, unsigned long long int roz_k, vector <pair<int, int>> *wek);
bool czy_mozna(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int roz_w, unsigned long long int roz_k);
int main()
{
vector <pair<int, int>> rezultat;
unsigned long long int n, m, k;
cin >> n >> m >> k;
char** plansza;
plansza = new char* [n];
for (unsigned long long int i = 0; i < n; i++) {
plansza[i] = new char[m];
}
for (unsigned long long int i = 0; i < n; i++) {
for (unsigned long long int x = 0; x < m; x++) {
cin >> plansza[i][x];
}
}
vector <pair<int, int>>szybkosc;
for (int i = 0; i < k; i++) {
unsigned long long int gora, dol;
cin >> gora >> dol;
pair<unsigned long long int, unsigned long long int> speed(gora, dol);
szybkosc.push_back(speed);
}
ruch(plansza, 0, 0, 0, 0, n, m, &rezultat);
int flaga = 0;
unsigned long long int licznik = 0;
unsigned long long int min = szybkosc[0].first * rezultat[0].first + szybkosc[0].second * rezultat[0].second;
for (int i = 0; i < k; i++)
{
flaga = 0;
for (unsigned long long int x = 0; x < rezultat.size(); x++) {
if (szybkosc[i].first * rezultat[x].first + szybkosc[i].second * rezultat[x].second == min&&flaga==0) {
licznik++;
flaga = 1;
}
else if (szybkosc[i].first * rezultat[x].first + szybkosc[i].second * rezultat[x].second < min)
{
licznik = 1;
min = szybkosc[i].first * rezultat[x].first + szybkosc[i].second * rezultat[x].second;
}
}
}
/*for (int i = 0; i < rezultat.size(); i++) {
cout <<"miju miju "<< rezultat[i].first << " " << rezultat[i].second << "\n";
}*/
cout << min << " " << licznik;
}
void ruch(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int r_gora, unsigned long long int r_dol, unsigned long long int roz_w, unsigned long long int roz_k, vector <pair<int, int>>* wek) {
plansza[w][k] = '1';
//cout << w << " " << k << "\n";
if (w == roz_w - 1 && k == roz_k - 1) {
pair<unsigned long long int, unsigned long long int> wynik (r_gora,r_dol);
//cout << "Wynik: "<<r_gora+r_dol<<"\n";
(*wek).push_back(wynik);
}
for (int i = 0; i < 4; i++) {
if (czy_mozna(plansza, w + ruchy[i][0], k + ruchy[i][1], roz_w, roz_k)) {
if (ruchy[i][0]==1||ruchy[i][1]==1)
{
ruch(plansza, w + ruchy[i][0], k + ruchy[i][1], r_gora + 1, r_dol, roz_w, roz_k, wek);
}
else {
ruch(plansza, w + ruchy[i][0], k + ruchy[i][1], r_gora, r_dol + 1, roz_w, roz_k, wek);
}
}
}
plansza[w][k] = '.';
}
bool czy_mozna(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int roz_w, unsigned long long int roz_k) {
return w>=0&&w<roz_w&&k>=0&&k<roz_k&&plansza[w][k]!='X'&& plansza[w][k] != '1';
}
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 | #include <iostream> #include <vector> using namespace std; const int ruchy[4][2] = { {1,0},{0,1},{-1,0},{0,-1} }; void ruch(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int r_gora, unsigned long long int r_dol, unsigned long long int roz_w, unsigned long long int roz_k, vector <pair<int, int>> *wek); bool czy_mozna(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int roz_w, unsigned long long int roz_k); int main() { vector <pair<int, int>> rezultat; unsigned long long int n, m, k; cin >> n >> m >> k; char** plansza; plansza = new char* [n]; for (unsigned long long int i = 0; i < n; i++) { plansza[i] = new char[m]; } for (unsigned long long int i = 0; i < n; i++) { for (unsigned long long int x = 0; x < m; x++) { cin >> plansza[i][x]; } } vector <pair<int, int>>szybkosc; for (int i = 0; i < k; i++) { unsigned long long int gora, dol; cin >> gora >> dol; pair<unsigned long long int, unsigned long long int> speed(gora, dol); szybkosc.push_back(speed); } ruch(plansza, 0, 0, 0, 0, n, m, &rezultat); int flaga = 0; unsigned long long int licznik = 0; unsigned long long int min = szybkosc[0].first * rezultat[0].first + szybkosc[0].second * rezultat[0].second; for (int i = 0; i < k; i++) { flaga = 0; for (unsigned long long int x = 0; x < rezultat.size(); x++) { if (szybkosc[i].first * rezultat[x].first + szybkosc[i].second * rezultat[x].second == min&&flaga==0) { licznik++; flaga = 1; } else if (szybkosc[i].first * rezultat[x].first + szybkosc[i].second * rezultat[x].second < min) { licznik = 1; min = szybkosc[i].first * rezultat[x].first + szybkosc[i].second * rezultat[x].second; } } } /*for (int i = 0; i < rezultat.size(); i++) { cout <<"miju miju "<< rezultat[i].first << " " << rezultat[i].second << "\n"; }*/ cout << min << " " << licznik; } void ruch(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int r_gora, unsigned long long int r_dol, unsigned long long int roz_w, unsigned long long int roz_k, vector <pair<int, int>>* wek) { plansza[w][k] = '1'; //cout << w << " " << k << "\n"; if (w == roz_w - 1 && k == roz_k - 1) { pair<unsigned long long int, unsigned long long int> wynik (r_gora,r_dol); //cout << "Wynik: "<<r_gora+r_dol<<"\n"; (*wek).push_back(wynik); } for (int i = 0; i < 4; i++) { if (czy_mozna(plansza, w + ruchy[i][0], k + ruchy[i][1], roz_w, roz_k)) { if (ruchy[i][0]==1||ruchy[i][1]==1) { ruch(plansza, w + ruchy[i][0], k + ruchy[i][1], r_gora + 1, r_dol, roz_w, roz_k, wek); } else { ruch(plansza, w + ruchy[i][0], k + ruchy[i][1], r_gora, r_dol + 1, roz_w, roz_k, wek); } } } plansza[w][k] = '.'; } bool czy_mozna(char** plansza, unsigned long long int w, unsigned long long int k, unsigned long long int roz_w, unsigned long long int roz_k) { return w>=0&&w<roz_w&&k>=0&&k<roz_k&&plansza[w][k]!='X'&& plansza[w][k] != '1'; } |
English