P7775 70pts求调
#include<bits/stdc++.h>
using namespace std;
char a[505][505];
struct node{
int x,y,dis;
};
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int vis[505][505];
int cnt,trex[2500],trey[2500];
int diss[505][505];int n,m;
void dist(){
for(int i=1;i<=cnt;i++){
for(int j=1;j<=n;j++)
for(int k=1;k<=m;k++)
diss[j][k]=min(diss[j][k],abs(trex[i]-j)+abs(trey[i]-k));
}
return ;
}
int main(){
memset(diss,0x3f3f,sizeof(diss));
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
int qx=0,qy=0,zx=0,zy=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='V')qx=i,qy=j;
else if(a[i][j]=='J')zx=i,zy=j;
else if(a[i][j]=='+'){
trex[++cnt]=i;trey[cnt]=j;
}
}
}
dist();
queue<node>dl;
dl.push(node{qx,qy,diss[qx][qy]});
vis[qx][qy]=1;
int ans=INT_MIN;
while(!dl.empty()){
node t;t=dl.front();
dl.pop();
if(t.x==zx&&t.y==zy){
ans=max(ans,min(t.dis,diss[zx][zy]));
continue;
}
for(int i=0;i<4;i++){
int tx=t.x+dir[i][0],ty=t.y+dir[i][1];
if(t.dis>vis[tx][ty]&&tx>=1&&tx<=n&&ty>=1&&ty<=m){
vis[tx][ty]=t.dis;
dl.push(node{tx,ty,min(t.dis,diss[tx][ty])});
}
}
}
cout<<ans;
return 0;
}