#include <iostream> #include <queue> #include <string> using namespace std; pair<int,int> droga[2005][2005]; string mapa[2005]; bool odwiedzone[2005][2005]; int main() { long long n,m,k; pair<int,int> a; cin>>n>>m>>k; queue<pair<int,int>> q; for(int i=1;i<=n;i++) { cin>>mapa[i]; } q.push(make_pair(1,1)); while(1) { a=q.front(); q.pop(); odwiedzone[a.first][a.second]=1; if(a.first==n && a.second==m) { break; } if(a.first!=1 && mapa[a.first-1][a.second-1]=='.' && odwiedzone[a.first-1][a.second]==0) { q.push(make_pair(a.first-1,a.second)); odwiedzone[a.first-1][a.second]=1; droga[a.first-1][a.second]=droga[a.first][a.second]; droga[a.first-1][a.second].second++; } if(a.second!=1 && mapa[a.first][a.second-2]=='.' && odwiedzone[a.first][a.second-1]==0) { q.push(make_pair(a.first,a.second-1)); odwiedzone[a.first][a.second-1]=1; droga[a.first][a.second-1]=droga[a.first][a.second]; droga[a.first][a.second-1].second++; } if(a.first!=n && mapa[a.first+1][a.second-1]=='.' && odwiedzone[a.first+1][a.second]==0) { q.push(make_pair(a.first+1,a.second)); odwiedzone[a.first+1][a.second]=1; droga[a.first+1][a.second]=droga[a.first][a.second]; droga[a.first+1][a.second].first++; } if(a.second!=m && mapa[a.first][a.second]=='.' && odwiedzone[a.first][a.second+1]==0) { q.push(make_pair(a.first,a.second+1)); odwiedzone[a.first][a.second+1]=1; droga[a.first][a.second+1]=droga[a.first][a.second]; droga[a.first][a.second+1].first++; } } long long x,y; long long wynik=-1; int liczba=1; for(int i=0;i<k;i++) { cin>>x>>y; if(droga[n][m].first*x+(droga[n][m].second*y)<wynik || wynik==-1) { wynik=droga[n][m].first*x+(droga[n][m].second*y); liczba=1; } else if(droga[n][m].first*x+(droga[n][m].second*y)==wynik) { liczba++; } } cout<<wynik<<" "<<liczba<<endl; }
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 | #include <iostream> #include <queue> #include <string> using namespace std; pair<int,int> droga[2005][2005]; string mapa[2005]; bool odwiedzone[2005][2005]; int main() { long long n,m,k; pair<int,int> a; cin>>n>>m>>k; queue<pair<int,int>> q; for(int i=1;i<=n;i++) { cin>>mapa[i]; } q.push(make_pair(1,1)); while(1) { a=q.front(); q.pop(); odwiedzone[a.first][a.second]=1; if(a.first==n && a.second==m) { break; } if(a.first!=1 && mapa[a.first-1][a.second-1]=='.' && odwiedzone[a.first-1][a.second]==0) { q.push(make_pair(a.first-1,a.second)); odwiedzone[a.first-1][a.second]=1; droga[a.first-1][a.second]=droga[a.first][a.second]; droga[a.first-1][a.second].second++; } if(a.second!=1 && mapa[a.first][a.second-2]=='.' && odwiedzone[a.first][a.second-1]==0) { q.push(make_pair(a.first,a.second-1)); odwiedzone[a.first][a.second-1]=1; droga[a.first][a.second-1]=droga[a.first][a.second]; droga[a.first][a.second-1].second++; } if(a.first!=n && mapa[a.first+1][a.second-1]=='.' && odwiedzone[a.first+1][a.second]==0) { q.push(make_pair(a.first+1,a.second)); odwiedzone[a.first+1][a.second]=1; droga[a.first+1][a.second]=droga[a.first][a.second]; droga[a.first+1][a.second].first++; } if(a.second!=m && mapa[a.first][a.second]=='.' && odwiedzone[a.first][a.second+1]==0) { q.push(make_pair(a.first,a.second+1)); odwiedzone[a.first][a.second+1]=1; droga[a.first][a.second+1]=droga[a.first][a.second]; droga[a.first][a.second+1].first++; } } long long x,y; long long wynik=-1; int liczba=1; for(int i=0;i<k;i++) { cin>>x>>y; if(droga[n][m].first*x+(droga[n][m].second*y)<wynik || wynik==-1) { wynik=droga[n][m].first*x+(droga[n][m].second*y); liczba=1; } else if(droga[n][m].first*x+(droga[n][m].second*y)==wynik) { liczba++; } } cout<<wynik<<" "<<liczba<<endl; } |