#include <bits/stdc++.h> #define inf 1000000000000000018 using namespace std; int n, m, k; char T[2003][2003]; long long score=inf; int ile=0; vector<int>D[5000006];//Graf void MakeG(int A, int B) { if (T[A][B+1]=='.') D[(A*m)+B].push_back((A*m)+B+1); if (T[A][B-1]=='.') D[(A*m)+B].push_back((A*m)+B-1); if (T[A+1][B]=='.') D[(A*m)+B].push_back((A*m)+B+m); if (T[A-1][B]=='.') D[(A*m)+B].push_back((A*m)+B-m); return; } pair<int, int>K[5000006]; queue<int>Kol; bool V[5000006]; void BFS(int A) { Kol.pop(); for (int i=0; i<D[A].size(); ++i){ if (V[D[A][i]]==false){ V[D[A][i]]=true; if (D[A][i]>A){ K[D[A][i]].first=K[A].first+1; K[D[A][i]].second=K[A].second; } else{ K[D[A][i]].first=K[A].first; K[D[A][i]].second=K[A].second+1; } Kol.push(D[A][i]); } } if (Kol.size()>0) BFS(Kol.front()); else return; } int main() { ios_base::sync_with_stdio(); cin.tie(0); cout.tie(0); cin>>n>>m>>k; for (int i=1; i<=n; ++i) for (int j=1; j<=m; ++j) cin>>T[i][j]; for (int i=0; i<=n; ++i) for (int j=0; j<=m; ++j) if (T[i][j]=='.') MakeG(i,j); Kol.push(m+1); V[m+1]=true; BFS(m+1); long long A=K[(n*m)+m].first, B=K[(n*m)+m].second; while (k>0){ long long C, D; cin>>C>>D; if ((A*C)+(B*D)<score){ score=((A*C)+(B*D)); ile=1; } else if ((A*C)+(B*D)==score) ++ile; --k; } cout<<score<<" "<<ile; 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 <bits/stdc++.h> #define inf 1000000000000000018 using namespace std; int n, m, k; char T[2003][2003]; long long score=inf; int ile=0; vector<int>D[5000006];//Graf void MakeG(int A, int B) { if (T[A][B+1]=='.') D[(A*m)+B].push_back((A*m)+B+1); if (T[A][B-1]=='.') D[(A*m)+B].push_back((A*m)+B-1); if (T[A+1][B]=='.') D[(A*m)+B].push_back((A*m)+B+m); if (T[A-1][B]=='.') D[(A*m)+B].push_back((A*m)+B-m); return; } pair<int, int>K[5000006]; queue<int>Kol; bool V[5000006]; void BFS(int A) { Kol.pop(); for (int i=0; i<D[A].size(); ++i){ if (V[D[A][i]]==false){ V[D[A][i]]=true; if (D[A][i]>A){ K[D[A][i]].first=K[A].first+1; K[D[A][i]].second=K[A].second; } else{ K[D[A][i]].first=K[A].first; K[D[A][i]].second=K[A].second+1; } Kol.push(D[A][i]); } } if (Kol.size()>0) BFS(Kol.front()); else return; } int main() { ios_base::sync_with_stdio(); cin.tie(0); cout.tie(0); cin>>n>>m>>k; for (int i=1; i<=n; ++i) for (int j=1; j<=m; ++j) cin>>T[i][j]; for (int i=0; i<=n; ++i) for (int j=0; j<=m; ++j) if (T[i][j]=='.') MakeG(i,j); Kol.push(m+1); V[m+1]=true; BFS(m+1); long long A=K[(n*m)+m].first, B=K[(n*m)+m].second; while (k>0){ long long C, D; cin>>C>>D; if ((A*C)+(B*D)<score){ score=((A*C)+(B*D)); ile=1; } else if ((A*C)+(B*D)==score) ++ile; --k; } cout<<score<<" "<<ile; return 0; } |