90分求调
查看原帖
90分求调
691641
Grow_楼主2023/7/4 17:10

第三个点TLE,其他的点只有3~4ms

#include<bits/stdc++.h>
#define int long long
using namespace std;
int w,h,a[1005][1005],ans=1e18,o,p,dx[]={0,0,1,-1},dy[]={1,-1,0,0};
bool f[1005][1005],f2[1005][1005];
struct node{
	int x[1000005],y[1000005],id[1000005];
	int front,back;
	void pop(){
		front++;
		return;
	}
	void push(int nx,int ny,int nid){
		++back;
		x[back]=nx;
		y[back]=ny;
		id[back]=nid;
		return;
	}
}q,q2;
int bfs2(int x,int y){
	memset(f,0,sizeof(f));
	q.front=1;
	q.back=0;
	q.push(x,y,0);
	while(q.back>=q.front){
		int ax = q.x[q.front];
		int ay = q.y[q.front];
		int id = q.id[q.front];
		if(a[ax][ay]==3){
			o=ax;
			p=ay;
			return id;
		}
		q.pop();
		for(int i = 0;i<4;i++){
			int nx = ax+dx[i];
			int ny = ay+dy[i];
			if(nx<1||ny<1||nx>h||ny>w||f[nx][ny])continue;
			if(a[nx][ny]==1)continue;
			f[nx][ny]=1;
			q.push(nx,ny,id+1);
		}
	} 
}
void bfs1(int x,int y){
	q2.front=1;
	q2.back=0;
	q2.push(x,y,0);
	while(q2.back>=q2.front){
		int ax = q2.x[q2.front];
		int ay = q2.y[q2.front];
		int id = q2.id[q2.front];
		if(a[ax][ay]==4){
			o=ax;
			p=ay;
			ans=min(ans,id+bfs2(ax,ay));
		}
		q2.pop();
		for(int i = 0;i<4;i++){
			int nx = ax+dx[i];
			int ny = ay+dy[i];
			if(nx<1||ny<1||nx>h||ny>w||f2[nx][ny])continue;
			if(a[nx][ny]==1||a[nx][ny]==3)continue;
		    f2[nx][ny]=1;
			q2.push(nx,ny,id+1);
		}
	}
	return;
}
signed main(){
    cin >> w >> h;
    for(int i = 1;i<=h;i++){
    	for(int j = 1;j<=w;j++)scanf("%d",&a[i][j]);
	}
	for(int i = 1;i<=h;i++){
		for(int j = 1;j<=w;j++){
			if(a[i][j]==2){
				bfs1(i,j);
				cout << ans;
				return 0;
			}
		}
	}
    return 0;
}
2023/7/4 17:10
加载中...