求调玄关
查看原帖
求调玄关
669053
Strelizia_楼主2024/8/13 09:59
#include<bits/stdc++.h>
using namespace std;
#define int long long
int m;
bool last[311][311];
bool vis[311][311];
bool des[311][311];
int ans[311][311]={-1};
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
struct node{
	int x;
	int y;
};
struct note{
	int x;
	int y;
	int t;
}n[311];
signed main(){
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>n[i].x>>n[i].y>>n[i].t;
		last[n[i].x][n[i].y]=1;
		for(int j=0;j<4;j++){
			if(0<=n[i].x+dx[j] and n[i].x+dx[j]<=310 and 0<=n[i].y+dy[j] and n[i].y+dy[j]<=310) last[n[i].x+dx[j]][n[i].y+dy[j]]=1;
		}
	}
	sort(n+1,n+m+1,[](note n1,note n2){
	    return n1.t<n2.t;
	});
	queue<note>q2;
	for(int i=1;i<=m;i++){
		q2.push(n[i]);
	}
	queue<node>q;
	q.push({0,0});
	ans[0][0]=0;
	vis[0][0]=1;
	if(last[0][0]==0){
		cout<<0;
		exit(0);
	}
	while(!q.empty()){
		node t=q.front();
		q.pop();
		if(last[t.x][t.y]==0){
			cout<<ans[t.x][t.y];
			exit(0);
		}
		while(!q2.empty() and q2.front().t==ans[t.x][t.y]){
			des[q2.front().x][q2.front().y]=1;
			for(int i=0;i<4;i++){
				if(0<=q2.front().x and q2.front().x<=310 and 0<=q2.front().y and q2.front().y<=310) des[q2.front().x+dx[i]][q2.front().y+dy[i]]=1;
			}
			q2.pop();
		}
		if(des[t.x][t.y]==1){
			ans[t.x][t.y]=-1;
			continue;
		}
	    for(int i=0;i<4;i++){
	    	int xx=t.x+dx[i];
	    	int yy=t.y+dy[i];
	    	if(0<=xx and xx<=310 and 0<=yy and yy<=310 and vis[xx][yy]==0 and des[xx][yy]==0){
	    		vis[xx][yy]=1;
	    		ans[xx][yy]=ans[t.x][t.y]+1;
				q.push({xx,yy});
			}
		}
	}
	cout<<-1;
	return 0;
}

63pts
wa on t10-14

bfs做法 大佬求调

2024/8/13 09:59
加载中...