#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <limits>
using namespace std;
int DirX[4] = { 0, 1, 0, -1};
int DirY[4] = {-1, 0, 1, 0};
int DeltaDist[4] = { 1, 0, 0, 1};
struct Point{
int x,y;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m,k;
cin >> n >> m >> k;
vector<string>Map(n);
for(string &row : Map)
cin >> row;
vector<vector<int>>DownhillDist(n, vector<int>(m, 1000000000));
vector<vector<bool>>Processed(n, vector<bool>(m, false));
queue<Point>CurrentQ, NextQ;
CurrentQ.push(Point{0,0});
DownhillDist[0][0]=0;
while(!CurrentQ.empty()){
while(!CurrentQ.empty()){
Point p = CurrentQ.front();
CurrentQ.pop();
if(Processed[p.y][p.x])
continue;
Processed[p.y][p.x]=true;
for(int dir=0;dir<4;dir++){
int x = p.x+DirX[dir];
int y = p.y+DirY[dir];
int dist = DownhillDist[p.y][p.x]+DeltaDist[dir];
if(x>=0 && x<m && y>=0 && y<n && Map[y][x]=='.' && DownhillDist[y][x]>dist){
DownhillDist[y][x] = dist;
if(DeltaDist[dir])
NextQ.push(Point{x,y});
else
CurrentQ.push(Point{x,y});
}
}
}
CurrentQ.swap(NextQ);
}
// for(auto row : DownhillDist){
// for(auto cell : row)
// if(cell==1000000000)
// cout << 'X';
// else
// cout << cell;
// cout << endl;
// }
long long bestTime=numeric_limits<long long>::max();
int bestGuys=0;
while(k--){
long long a, b;
cin >> a >> b;
long long res = (n+m-2)*a + DownhillDist.back().back()*(a+b);
if(bestTime>res){
bestTime=res;
bestGuys=1;
}
else if(bestTime==res)
bestGuys++;
}
cout << bestTime << " " << bestGuys << "\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 | #include <iostream> #include <queue> #include <vector> #include <string> #include <limits> using namespace std; int DirX[4] = { 0, 1, 0, -1}; int DirY[4] = {-1, 0, 1, 0}; int DeltaDist[4] = { 1, 0, 0, 1}; struct Point{ int x,y; }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n,m,k; cin >> n >> m >> k; vector<string>Map(n); for(string &row : Map) cin >> row; vector<vector<int>>DownhillDist(n, vector<int>(m, 1000000000)); vector<vector<bool>>Processed(n, vector<bool>(m, false)); queue<Point>CurrentQ, NextQ; CurrentQ.push(Point{0,0}); DownhillDist[0][0]=0; while(!CurrentQ.empty()){ while(!CurrentQ.empty()){ Point p = CurrentQ.front(); CurrentQ.pop(); if(Processed[p.y][p.x]) continue; Processed[p.y][p.x]=true; for(int dir=0;dir<4;dir++){ int x = p.x+DirX[dir]; int y = p.y+DirY[dir]; int dist = DownhillDist[p.y][p.x]+DeltaDist[dir]; if(x>=0 && x<m && y>=0 && y<n && Map[y][x]=='.' && DownhillDist[y][x]>dist){ DownhillDist[y][x] = dist; if(DeltaDist[dir]) NextQ.push(Point{x,y}); else CurrentQ.push(Point{x,y}); } } } CurrentQ.swap(NextQ); } // for(auto row : DownhillDist){ // for(auto cell : row) // if(cell==1000000000) // cout << 'X'; // else // cout << cell; // cout << endl; // } long long bestTime=numeric_limits<long long>::max(); int bestGuys=0; while(k--){ long long a, b; cin >> a >> b; long long res = (n+m-2)*a + DownhillDist.back().back()*(a+b); if(bestTime>res){ bestTime=res; bestGuys=1; } else if(bestTime==res) bestGuys++; } cout << bestTime << " " << bestGuys << "\n"; return 0; } |
English