#include <iostream>
#include <limits>
#include <queue>
using namespace std;
int m,n,k;
bool mapa[2000][2000];
int dist[2000][2000];
int a[1000000];
int b[1000000];
int main()
{
cin.sync_with_stdio(0);
cin >> n >> m >> k;
for(int y=0; y<n; ++y)
{
for(int x=0; x<m; ++x)
{
char c;
cin >> c;
if(c=='.')
{
mapa[y][x] = true;
}
}
}
for(int i=0; i<k; ++i)
{
cin >> a[i] >> b[i];
}
for(int y=0; y<n; ++y)
{
for(int x=0; x<m; ++x)
{
dist[y][x] = 1'000'000'000;
}
}
dist[0][0] = 0;
queue<pair<int,int>> q;
q.push(make_pair(0,0));
while(!q.empty())
{
pair<int,int> pos = q.front();
q.pop();
if(!mapa[pos.first][pos.second])
{
continue;
}
int adj[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
for(int i=0; i<4; ++i)
{
int new_y = pos.first + adj[i][0];
int new_x = pos.second + adj[i][1];
if(new_x<0 || new_y<0 || new_x>=m || new_y>=n || !mapa[new_y][new_x])
{
continue;
}
dist[new_y][new_x] = min(dist[new_y][new_x],dist[pos.first][pos.second]+1);
q.push(make_pair(new_y,new_x));
}
mapa[pos.first][pos.second] = false;
}
long long int best_time = numeric_limits<long long int>::max();
int people_count = 0;
for(int i=0; i<k; ++i)
{
long long int base_steps = (n+m-2);
long long int extra_2steps = (dist[n-1][m-1]-(n+m-2))/2;
long long int new_time = a[i]*base_steps + (a[i]+b[i])*extra_2steps;
if(new_time<best_time)
{
best_time = new_time;
people_count = 1;
}
else if(new_time==best_time)
{
people_count++;
}
}
cout << best_time << " " << people_count;
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 | #include <iostream> #include <limits> #include <queue> using namespace std; int m,n,k; bool mapa[2000][2000]; int dist[2000][2000]; int a[1000000]; int b[1000000]; int main() { cin.sync_with_stdio(0); cin >> n >> m >> k; for(int y=0; y<n; ++y) { for(int x=0; x<m; ++x) { char c; cin >> c; if(c=='.') { mapa[y][x] = true; } } } for(int i=0; i<k; ++i) { cin >> a[i] >> b[i]; } for(int y=0; y<n; ++y) { for(int x=0; x<m; ++x) { dist[y][x] = 1'000'000'000; } } dist[0][0] = 0; queue<pair<int,int>> q; q.push(make_pair(0,0)); while(!q.empty()) { pair<int,int> pos = q.front(); q.pop(); if(!mapa[pos.first][pos.second]) { continue; } int adj[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; for(int i=0; i<4; ++i) { int new_y = pos.first + adj[i][0]; int new_x = pos.second + adj[i][1]; if(new_x<0 || new_y<0 || new_x>=m || new_y>=n || !mapa[new_y][new_x]) { continue; } dist[new_y][new_x] = min(dist[new_y][new_x],dist[pos.first][pos.second]+1); q.push(make_pair(new_y,new_x)); } mapa[pos.first][pos.second] = false; } long long int best_time = numeric_limits<long long int>::max(); int people_count = 0; for(int i=0; i<k; ++i) { long long int base_steps = (n+m-2); long long int extra_2steps = (dist[n-1][m-1]-(n+m-2))/2; long long int new_time = a[i]*base_steps + (a[i]+b[i])*extra_2steps; if(new_time<best_time) { best_time = new_time; people_count = 1; } else if(new_time==best_time) { people_count++; } } cout << best_time << " " << people_count; return 0; } |
English