#include <bits/stdc++.h> using namespace std; #define ll long long #define st first #define nd second int dist[2005][2005]; bool nie[2005][2005]; ll a[(int)1e6 + 10],b[(int)1e6 + 10]; int main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n,m,k; cin >> n >> m >> k; for(int i = 1; i <= n; i++){ string s; cin >> s; for(int j = 1; j <= m; j++) if(s[j - 1] == 'X') nie[i][j] = 1; } for(int j = 0; j <= m + 1; j++){ nie[0][j] = 1; nie[n + 1][j] = 1; } for(int i = 0; i <= n + 1; i++){ nie[i][0] = 1; nie[i][m + 1] = 1; } for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) dist[i][j] = 1e9; dist[1][1] = 0; queue<pair<int,int> > q; q.push({1,1}); vector<int> vi = {0,0,-1,1},vj = {1,-1,0,0}; while(q.size()){ pair<int,int> v = q.front(); q.pop(); pair<int,int> w; for(int i = 0; i < 4; i++){ w = v; w.st += vi[i]; w.nd += vj[i]; if(nie[w.st][w.nd] == 0 && dist[w.st][w.nd] == 1e9){ dist[w.st][w.nd] = dist[v.st][v.nd] + 1; q.push(w); } } } ll ans = 1e18; ll t1,t2; t1 = m + n - 2; t2 = dist[n][m] - t1; t2 /= 2; for(int i = 1; i <= k; i++){ cin >> a[i] >> b[i]; ans = min(ans,a[i] * t1 + (a[i] + b[i]) * t2); } int cnt = 0; for(int i = 1; i <= k; i++) if(ans == a[i] * t1 + (a[i] + b[i]) * t2) cnt++; cout << ans << ' ' << cnt; 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 | #include <bits/stdc++.h> using namespace std; #define ll long long #define st first #define nd second int dist[2005][2005]; bool nie[2005][2005]; ll a[(int)1e6 + 10],b[(int)1e6 + 10]; int main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n,m,k; cin >> n >> m >> k; for(int i = 1; i <= n; i++){ string s; cin >> s; for(int j = 1; j <= m; j++) if(s[j - 1] == 'X') nie[i][j] = 1; } for(int j = 0; j <= m + 1; j++){ nie[0][j] = 1; nie[n + 1][j] = 1; } for(int i = 0; i <= n + 1; i++){ nie[i][0] = 1; nie[i][m + 1] = 1; } for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) dist[i][j] = 1e9; dist[1][1] = 0; queue<pair<int,int> > q; q.push({1,1}); vector<int> vi = {0,0,-1,1},vj = {1,-1,0,0}; while(q.size()){ pair<int,int> v = q.front(); q.pop(); pair<int,int> w; for(int i = 0; i < 4; i++){ w = v; w.st += vi[i]; w.nd += vj[i]; if(nie[w.st][w.nd] == 0 && dist[w.st][w.nd] == 1e9){ dist[w.st][w.nd] = dist[v.st][v.nd] + 1; q.push(w); } } } ll ans = 1e18; ll t1,t2; t1 = m + n - 2; t2 = dist[n][m] - t1; t2 /= 2; for(int i = 1; i <= k; i++){ cin >> a[i] >> b[i]; ans = min(ans,a[i] * t1 + (a[i] + b[i]) * t2); } int cnt = 0; for(int i = 1; i <= k; i++) if(ans == a[i] * t1 + (a[i] + b[i]) * t2) cnt++; cout << ans << ' ' << cnt; return 0; } |