#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; } |
English