#include <bits/stdc++.h>
#define ii pair<int, int>
#define ff first
#define ss second
using namespace std;
struct W {
vector<int> sa;
vector<int> sb;
int oa;
int ob;
bool o;
};
void bfs(vector<W>& v, int a, int b) {
queue<pair<int, ii>> q;
q.push({a, {0, 0}});
while(!q.empty()) {
int i = q.front().ff;
ii d = q.front().ss;
q.pop();
if(v[i].o) continue;
v[i].o = true;
v[i].oa = d.ff;
v[i].ob = d.ss;
if(i == b) return;
for(int j: v[i].sa) {
q.push({j, {d.ff+1, d.ss}});
}
for(int j: v[i].sb) {
q.push({j, {d.ff, d.ss+1}});
}
}
}
int main() {
int n, m, k, x, y;
scanf("%d %d %d\n", &n, &m, &k);
vector<bool> pop(m, false);
vector<W> v(n*m);
char c;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
scanf("%c", &c);
if(c == 'X') {
pop[j] = false;
continue;
}
if(j > 0 && pop[j-1]) {
v[i*m+j-1].sa.push_back(i*m+j);
v[i*m+j].sb.push_back(i*m+j-1);
}
if(i > 0 && pop[j]) {
v[(i-1)*m+j].sa.push_back(i*m+j);
v[i*m+j].sb.push_back((i-1)*m+j);
}
pop[j] = true;
}
scanf("\n");
}
bfs(v, 0, n*m-1);
int a = v[n*m-1].oa;
int b = v[n*m-1].ob;
long long ma = LLONG_MAX;;
int mi = 0;
for(int i = 0; i < k; i++) {
scanf("%d %d", &x, &y);
long long w = (long long)a*x + (long long)b*y;
if(w == ma) {
mi++;
}
if(w < ma) {
ma = w;
mi = 1;
}
}
printf("%lld %d", ma, mi);
}
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 <bits/stdc++.h> #define ii pair<int, int> #define ff first #define ss second using namespace std; struct W { vector<int> sa; vector<int> sb; int oa; int ob; bool o; }; void bfs(vector<W>& v, int a, int b) { queue<pair<int, ii>> q; q.push({a, {0, 0}}); while(!q.empty()) { int i = q.front().ff; ii d = q.front().ss; q.pop(); if(v[i].o) continue; v[i].o = true; v[i].oa = d.ff; v[i].ob = d.ss; if(i == b) return; for(int j: v[i].sa) { q.push({j, {d.ff+1, d.ss}}); } for(int j: v[i].sb) { q.push({j, {d.ff, d.ss+1}}); } } } int main() { int n, m, k, x, y; scanf("%d %d %d\n", &n, &m, &k); vector<bool> pop(m, false); vector<W> v(n*m); char c; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { scanf("%c", &c); if(c == 'X') { pop[j] = false; continue; } if(j > 0 && pop[j-1]) { v[i*m+j-1].sa.push_back(i*m+j); v[i*m+j].sb.push_back(i*m+j-1); } if(i > 0 && pop[j]) { v[(i-1)*m+j].sa.push_back(i*m+j); v[i*m+j].sb.push_back((i-1)*m+j); } pop[j] = true; } scanf("\n"); } bfs(v, 0, n*m-1); int a = v[n*m-1].oa; int b = v[n*m-1].ob; long long ma = LLONG_MAX;; int mi = 0; for(int i = 0; i < k; i++) { scanf("%d %d", &x, &y); long long w = (long long)a*x + (long long)b*y; if(w == ma) { mi++; } if(w < ma) { ma = w; mi = 1; } } printf("%lld %d", ma, mi); } |
English