#include<iostream>
#include<queue>
#include<vector>
using namespace std;
vector<vector<pair<int,int>>> graph;
char map[2001][2001];
long long results[4'000'002][2];
queue<int> q;
long long n,m,k,result=9'223'372'036'854'775'807,coun=0;
void bfs()
{
q.push(1);
while(!q.empty())
{
int v=q.front();
q.pop();
for(int i=0; i<graph[v].size(); i++)
{
if(!results[graph[v][i].first][0])
{
if(graph[v][i].second==1)
{
results[graph[v][i].first][0]=results[v][0]+1;
results[graph[v][i].first][1]=results[v][1];
}
if(graph[v][i].second==2)
{
results[graph[v][i].first][0]=results[v][0];
results[graph[v][i].first][1]=results[v][1]+1;
}
q.push(graph[v][i].first);
}
}
}
}
int main()
{
graph.resize(4'000'002);
cin>>n>>m>>k;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>map[i][j];
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
if(map[i][j+1]=='.')
{
graph[(i-1)*m+j].push_back({(i-1)*m+j+1,1});
}
if(map[i+1][j]=='.')
{
graph[(i-1)*m+j].push_back({i*m+j,1});
}
if(map[i][j-1]=='.')
{
graph[(i-1)*m+j].push_back({(i-1)*m+j-1,2});
}
if(i>1)
if(map[i-1][j]=='.')
{
graph[(i-1)*m+j].push_back({(i-2)*m+j,2});
}
}
}
bfs();
for(int i=0; i<k; i++)
{
long long temp, temp2;
cin>>temp>>temp2;
if(temp*results[m*n][0]+temp2*results[m*n][1]<result)
{
result=temp*results[m*n][0]+temp2*results[m*n][1];
coun=1;
}
else if(temp*results[m*n][0]+temp2*results[m*n][1]==result)
{
coun++;
}
}
cout<<result<<" "<<coun;
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 | #include<iostream> #include<queue> #include<vector> using namespace std; vector<vector<pair<int,int>>> graph; char map[2001][2001]; long long results[4'000'002][2]; queue<int> q; long long n,m,k,result=9'223'372'036'854'775'807,coun=0; void bfs() { q.push(1); while(!q.empty()) { int v=q.front(); q.pop(); for(int i=0; i<graph[v].size(); i++) { if(!results[graph[v][i].first][0]) { if(graph[v][i].second==1) { results[graph[v][i].first][0]=results[v][0]+1; results[graph[v][i].first][1]=results[v][1]; } if(graph[v][i].second==2) { results[graph[v][i].first][0]=results[v][0]; results[graph[v][i].first][1]=results[v][1]+1; } q.push(graph[v][i].first); } } } } int main() { graph.resize(4'000'002); cin>>n>>m>>k; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { cin>>map[i][j]; } } for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { if(map[i][j+1]=='.') { graph[(i-1)*m+j].push_back({(i-1)*m+j+1,1}); } if(map[i+1][j]=='.') { graph[(i-1)*m+j].push_back({i*m+j,1}); } if(map[i][j-1]=='.') { graph[(i-1)*m+j].push_back({(i-1)*m+j-1,2}); } if(i>1) if(map[i-1][j]=='.') { graph[(i-1)*m+j].push_back({(i-2)*m+j,2}); } } } bfs(); for(int i=0; i<k; i++) { long long temp, temp2; cin>>temp>>temp2; if(temp*results[m*n][0]+temp2*results[m*n][1]<result) { result=temp*results[m*n][0]+temp2*results[m*n][1]; coun=1; } else if(temp*results[m*n][0]+temp2*results[m*n][1]==result) { coun++; } } cout<<result<<" "<<coun; return 0; } |
English