大佬们帮忙看一下本萌新代码的时间复杂度
查看原帖
大佬们帮忙看一下本萌新代码的时间复杂度
498837
Laoshan_PLUS楼主2023/5/18 22:10

反复看好几遍,时间复杂度看上去完全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;
}
2023/5/18 22:10
加载中...