#include <cstdio>
#include <queue>
#include <iostream>
#include <climits>
using namespace std;
#define D(x)
#define MAX 2022
#define MAX2 1000100
typedef long long I;
char M[MAX][MAX];
I M2[MAX][MAX];
I a[MAX2], b[MAX2];
int n,m,k;
void printM() {
for(int i=0;i<=n+1;i++) {
for(int j=0;j<=m+1;j++) printf("%c", M[i][j]);
printf("\n");
}
}
struct V {
int x,y;
I k;
};
V kier[] = {{0,1, -2000000}, {0,-1, -1} , {1,0, -2000000}, {-1, 0, -1}};
int main()
{
scanf("%d %d %d", &n ,&m, &k);
for(int i=1;i<=n;i++) scanf(" %s", &M[i][1]);
for(int i=0;i< k;i++) scanf("%lld %lld", &a[i], &b[i]);
for(int i=0;i<=m+1;i++) M[n+1][i] = M[0][i] = 'X';
for(int i=0;i<=n+1;i++) M[i][0] = M[i][m+1] = 'X';
D(printM());
queue<V> q;
q.push(V{1,1,0});
M[1][1]= 'X';
while(!q.empty()) {
auto p = q.front();
q.pop();
for(auto v : kier) {
V np = {p.x + v.x, p.y + v.y, 0};
if(M[np.x][np.y] != 'X') {
M2[np.x][np.y] = min(M2[np.x][np.y], M2[p.x][p.y] + v.k);
M[np.x][np.y] = 'X';
q.push(np);
}
}
}
I aa = -M2[n][m] / 2000000, bb = (-M2[n][m])%2000000;
D(cout << aa << " " << bb << "\n");
I sm = LLONG_MAX, c = 0;
for(int i=0;i<k;i++) {
a[i] = a[i]*aa + b[i]*bb;
sm = min(sm, a[i]);
}
for(int i=0;i<k;i++) if(a[i]==sm) c++;
cout << sm << " " << c << "\n";
}
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 | #include <cstdio> #include <queue> #include <iostream> #include <climits> using namespace std; #define D(x) #define MAX 2022 #define MAX2 1000100 typedef long long I; char M[MAX][MAX]; I M2[MAX][MAX]; I a[MAX2], b[MAX2]; int n,m,k; void printM() { for(int i=0;i<=n+1;i++) { for(int j=0;j<=m+1;j++) printf("%c", M[i][j]); printf("\n"); } } struct V { int x,y; I k; }; V kier[] = {{0,1, -2000000}, {0,-1, -1} , {1,0, -2000000}, {-1, 0, -1}}; int main() { scanf("%d %d %d", &n ,&m, &k); for(int i=1;i<=n;i++) scanf(" %s", &M[i][1]); for(int i=0;i< k;i++) scanf("%lld %lld", &a[i], &b[i]); for(int i=0;i<=m+1;i++) M[n+1][i] = M[0][i] = 'X'; for(int i=0;i<=n+1;i++) M[i][0] = M[i][m+1] = 'X'; D(printM()); queue<V> q; q.push(V{1,1,0}); M[1][1]= 'X'; while(!q.empty()) { auto p = q.front(); q.pop(); for(auto v : kier) { V np = {p.x + v.x, p.y + v.y, 0}; if(M[np.x][np.y] != 'X') { M2[np.x][np.y] = min(M2[np.x][np.y], M2[p.x][p.y] + v.k); M[np.x][np.y] = 'X'; q.push(np); } } } I aa = -M2[n][m] / 2000000, bb = (-M2[n][m])%2000000; D(cout << aa << " " << bb << "\n"); I sm = LLONG_MAX, c = 0; for(int i=0;i<k;i++) { a[i] = a[i]*aa + b[i]*bb; sm = min(sm, a[i]); } for(int i=0;i<k;i++) if(a[i]==sm) c++; cout << sm << " " << c << "\n"; } |
English