#include<bits/stdc++.h> using namespace std; pair<long long, long long> wartosci[2010][2010]; queue<pair<long long, long long>> kolejka; long long wynik[1000010]; string slowo; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, k, i, j; cin>>n>>m>>k; getline(cin, slowo); for(i=1;i<=n;i++) { getline(cin, slowo); for(j=1;j<=m;j++) { wartosci[i][j].first = -1; if(slowo[j-1] == 'X') wartosci[i][j].first = -2; } } //bfs; kolejka.push({1,1}); wartosci[1][1].first = 0; while(kolejka.size()>0) { int x, y; x = kolejka.front().first; y = kolejka.front().second; kolejka.pop(); if(wartosci[x-1][y].first == -1) { wartosci[x-1][y] ={wartosci[x][y].first, wartosci[x][y].second+1}; kolejka.push({x-1,y}); } if(wartosci[x][y-1].first == -1) { wartosci[x][y-1] ={wartosci[x][y].first, wartosci[x][y].second+1}; kolejka.push({x,y-1}); } if(wartosci[x+1][y].first == -1) { wartosci[x+1][y] ={wartosci[x][y].first+1, wartosci[x][y].second}; kolejka.push({x+1,y}); } if(wartosci[x][y+1].first == -1) { wartosci[x][y+1] ={wartosci[x][y].first+1, wartosci[x][y].second}; kolejka.push({x,y+1}); } //printf("%d %d %d %d\n", x, y, wartosci[x][y].first, wartosci[x][y].second); } //printf("%d %d\n", wartosci[n][m].first, wartosci[n][m].second); long long mini = -1, ile=0; for(i=1;i<=k;i++) { int a, b; cin>>a>>b; wynik[i] = (long long)wartosci[n][m].first*(long long)a; wynik[i] += (long long)wartosci[n][m].second*(long long)b; } mini = wynik[1]; ile = 1; for(i=2;i<=k;i++) { if(wynik[i] == mini) ile++; else if(mini > wynik[i]) { mini = wynik[i]; ile=1; } } cout<<mini<<" "<<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 | #include<bits/stdc++.h> using namespace std; pair<long long, long long> wartosci[2010][2010]; queue<pair<long long, long long>> kolejka; long long wynik[1000010]; string slowo; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, k, i, j; cin>>n>>m>>k; getline(cin, slowo); for(i=1;i<=n;i++) { getline(cin, slowo); for(j=1;j<=m;j++) { wartosci[i][j].first = -1; if(slowo[j-1] == 'X') wartosci[i][j].first = -2; } } //bfs; kolejka.push({1,1}); wartosci[1][1].first = 0; while(kolejka.size()>0) { int x, y; x = kolejka.front().first; y = kolejka.front().second; kolejka.pop(); if(wartosci[x-1][y].first == -1) { wartosci[x-1][y] ={wartosci[x][y].first, wartosci[x][y].second+1}; kolejka.push({x-1,y}); } if(wartosci[x][y-1].first == -1) { wartosci[x][y-1] ={wartosci[x][y].first, wartosci[x][y].second+1}; kolejka.push({x,y-1}); } if(wartosci[x+1][y].first == -1) { wartosci[x+1][y] ={wartosci[x][y].first+1, wartosci[x][y].second}; kolejka.push({x+1,y}); } if(wartosci[x][y+1].first == -1) { wartosci[x][y+1] ={wartosci[x][y].first+1, wartosci[x][y].second}; kolejka.push({x,y+1}); } //printf("%d %d %d %d\n", x, y, wartosci[x][y].first, wartosci[x][y].second); } //printf("%d %d\n", wartosci[n][m].first, wartosci[n][m].second); long long mini = -1, ile=0; for(i=1;i<=k;i++) { int a, b; cin>>a>>b; wynik[i] = (long long)wartosci[n][m].first*(long long)a; wynik[i] += (long long)wartosci[n][m].second*(long long)b; } mini = wynik[1]; ile = 1; for(i=2;i<=k;i++) { if(wynik[i] == mini) ile++; else if(mini > wynik[i]) { mini = wynik[i]; ile=1; } } cout<<mini<<" "<<ile<<"\n"; } |