#include<bits/stdc++.h>
using namespace std;
int n,m,q;
long long p[2005][2005],d[2005][2005];
char t[2005][2005];
bool odw[2005][2005];
bool bezpieczne(int x,int y)
{
if(t[x][y] == '.' && !odw[x][y])
return 1;
return 0;
}
void Dikstra()
{
priority_queue< pair<int,pair<int,int> > > Q;
Q.push({0,{1,1}});
p[1][1] = d[1][1] = 0;
while(!Q.empty())
{
int x = Q.top().second.first;
int y = Q.top().second.second;
int k = Q.top().first * -1;
Q.pop();
if(!odw[x][y])
{
odw[x][y] = 1;
if(bezpieczne(x + 1,y) && k + 1 < (p[x + 1][y] + d[x + 1][y] * 2))
{
p[x + 1][y] = p[x][y] + 1;
d[x + 1][y] = d[x][y];
Q.push({(k + 1) * -1,{x + 1,y}});
}
if(bezpieczne(x,y + 1) && k + 1 < (p[x][y + 1] + d[x][y + 1] * 2))
{
p[x][y + 1] = p[x][y] + 1;
d[x][y + 1] = d[x][y];
Q.push({(k + 1) * -1,{x,y + 1}});
}
if(bezpieczne(x - 1,y) && k + 2 < (p[x - 1][y] + d[x - 1][y] * 2))
{
p[x - 1][y] = p[x][y];
d[x - 1][y] = d[x][y] + 1;
Q.push({(k + 2) * -1,{x - 1,y}});
}
if(bezpieczne(x,y - 1) && k + 2 < (p[x][y - 1] + d[x][y - 1] * 2))
{
p[x][y - 1] = p[x][y];
d[x][y - 1] = d[x][y] + 1;
Q.push({(k + 2) * -1,{x,y - 1}});
}
}
}
return;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>q;
for(int i = 0;i <= n + 1; i++)
t[0][i] = t[m + 1][i] = 'X';
for(int i = 0;i <= m; i++)
t[i][0] = t[i][n + 1] = 'X';
for(int i = 1;i <= n; i++)
for(int j = 1;j <= m; j++)
{
cin>>t[j][i];
p[j][i] = 5e6;
d[j][i] = 5e6;
}
Dikstra();
//cout<<p[m][n]<<" "<<d[m][n]<<'\n';
long long wyn = 1e18,ile = 0;
for(int i = 0;i < q; i++)
{
int a,b;
cin>>a>>b;
long long czas = p[m][n] * a + d[m][n] * b;
if(czas < wyn)
{
wyn = czas;
ile = 1;
}
else if(czas == wyn)
ile++;
}
cout<<wyn<<" "<<ile<<'\n';
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 | #include<bits/stdc++.h> using namespace std; int n,m,q; long long p[2005][2005],d[2005][2005]; char t[2005][2005]; bool odw[2005][2005]; bool bezpieczne(int x,int y) { if(t[x][y] == '.' && !odw[x][y]) return 1; return 0; } void Dikstra() { priority_queue< pair<int,pair<int,int> > > Q; Q.push({0,{1,1}}); p[1][1] = d[1][1] = 0; while(!Q.empty()) { int x = Q.top().second.first; int y = Q.top().second.second; int k = Q.top().first * -1; Q.pop(); if(!odw[x][y]) { odw[x][y] = 1; if(bezpieczne(x + 1,y) && k + 1 < (p[x + 1][y] + d[x + 1][y] * 2)) { p[x + 1][y] = p[x][y] + 1; d[x + 1][y] = d[x][y]; Q.push({(k + 1) * -1,{x + 1,y}}); } if(bezpieczne(x,y + 1) && k + 1 < (p[x][y + 1] + d[x][y + 1] * 2)) { p[x][y + 1] = p[x][y] + 1; d[x][y + 1] = d[x][y]; Q.push({(k + 1) * -1,{x,y + 1}}); } if(bezpieczne(x - 1,y) && k + 2 < (p[x - 1][y] + d[x - 1][y] * 2)) { p[x - 1][y] = p[x][y]; d[x - 1][y] = d[x][y] + 1; Q.push({(k + 2) * -1,{x - 1,y}}); } if(bezpieczne(x,y - 1) && k + 2 < (p[x][y - 1] + d[x][y - 1] * 2)) { p[x][y - 1] = p[x][y]; d[x][y - 1] = d[x][y] + 1; Q.push({(k + 2) * -1,{x,y - 1}}); } } } return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>q; for(int i = 0;i <= n + 1; i++) t[0][i] = t[m + 1][i] = 'X'; for(int i = 0;i <= m; i++) t[i][0] = t[i][n + 1] = 'X'; for(int i = 1;i <= n; i++) for(int j = 1;j <= m; j++) { cin>>t[j][i]; p[j][i] = 5e6; d[j][i] = 5e6; } Dikstra(); //cout<<p[m][n]<<" "<<d[m][n]<<'\n'; long long wyn = 1e18,ile = 0; for(int i = 0;i < q; i++) { int a,b; cin>>a>>b; long long czas = p[m][n] * a + d[m][n] * b; if(czas < wyn) { wyn = czas; ile = 1; } else if(czas == wyn) ile++; } cout<<wyn<<" "<<ile<<'\n'; return 0; } |
English