反复看好几遍,时间复杂度看上去完全OK,但不开O2的话RE+TLE+WA,开了O2之后RE的全成TLE了,剩下不是TLE就是WA。。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int n,m,mhd[501][501],ans=LONG_LONG_MAX;
bool vis[501][501];
char g[501][501];
int sx,sy,ex,ey;
vector<pair<int, int> > trees;
void Manhattan(){
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) mhd[i][j]=LONG_LONG_MAX;
for(int a=0;a<trees.size();a++){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int x=trees[a].first,y=trees[a].second;
mhd[i][j]=min(mhd[i][j],abs(x-i)+abs(y-j));
}
}
}
}
void dfs(int x,int y){
ans=min(ans,mhd[x][y]);
if(x==ex&&y==ey) return;
int maxn=-1,xx,yy;
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&!vis[nx][ny]){
if(maxn<=mhd[nx][ny]){
maxn=mhd[nx][ny];
xx=nx,yy=ny;
}
}
}
vis[xx][yy]=1;
dfs(xx,yy);
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
if(g[i][j]=='V') sx=i,sy=j;
if(g[i][j]=='J') ex=i,ey=j;
if(g[i][j]=='+') trees.push_back(make_pair(i,j));
}
}
Manhattan();
dfs(sx,sy);
cout<<ans<<endl;
return 0;
}