#include <bits/stdc++.h>
using namespace std;
const int MX=2020,MID=MX*MX,MQ=MID*2;
const int dx[4]={-1,0,1,0};
const int dy[4]={0,-1,0,1};
int n,m,q,A,B,cnt,i,j,x,y,d,fi,fr,qx[MQ],qy[MQ],qz[MQ],dst[MX][MX],cur;
long long dist,res,best=1000000000000000000LL;
char s[MX][MX];
int main() {
scanf("%d%d%d",&n,&m,&q);
for (i=0; i<n; i++) scanf("%s",s[i]);
dst[0][0]=qz[fi=MID]=1;
for (fr=MID+1; fi<fr; ) {
i=qx[fi];
j=qy[fi];
cur=qz[fi++];
if (dst[i][j]!=cur) continue;
for (d=0; d<4; d++) {
x=i+dx[d];
y=j+dy[d];
if (x<0 || x>=n || y<0 || y>=m || s[x][y]=='X') continue;
cur=dst[i][j]+int(d<2);
if (dst[x][y]==0 || cur<dst[x][y]) {
dst[x][y]=cur;
if (d<2) {
qx[fr]=x;
qy[fr]=y;
qz[fr++]=cur;
} else {
qx[--fi]=x;
qy[fi]=y;
qz[fi]=cur;
}
}
}
}
dist=dst[n-1][m-1]-1;
while (q--) {
scanf("%d%d",&A,&B);
res=(n+m-2LL)*A+dist*(A+B);
if (res<best) {
best=res;
cnt=1;
} else if (res==best) ++cnt;
}
printf("%lld %d\n",best,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 | #include <bits/stdc++.h> using namespace std; const int MX=2020,MID=MX*MX,MQ=MID*2; const int dx[4]={-1,0,1,0}; const int dy[4]={0,-1,0,1}; int n,m,q,A,B,cnt,i,j,x,y,d,fi,fr,qx[MQ],qy[MQ],qz[MQ],dst[MX][MX],cur; long long dist,res,best=1000000000000000000LL; char s[MX][MX]; int main() { scanf("%d%d%d",&n,&m,&q); for (i=0; i<n; i++) scanf("%s",s[i]); dst[0][0]=qz[fi=MID]=1; for (fr=MID+1; fi<fr; ) { i=qx[fi]; j=qy[fi]; cur=qz[fi++]; if (dst[i][j]!=cur) continue; for (d=0; d<4; d++) { x=i+dx[d]; y=j+dy[d]; if (x<0 || x>=n || y<0 || y>=m || s[x][y]=='X') continue; cur=dst[i][j]+int(d<2); if (dst[x][y]==0 || cur<dst[x][y]) { dst[x][y]=cur; if (d<2) { qx[fr]=x; qy[fr]=y; qz[fr++]=cur; } else { qx[--fi]=x; qy[fi]=y; qz[fi]=cur; } } } } dist=dst[n-1][m-1]-1; while (q--) { scanf("%d%d",&A,&B); res=(n+m-2LL)*A+dist*(A+B); if (res<best) { best=res; cnt=1; } else if (res==best) ++cnt; } printf("%lld %d\n",best,cnt); return 0; } |
English