2c_s @ 2023-04-18 17:44:43
#include<bits/stdc++.h>
using namespace std;
const int N=50010,M=310;
int n,x[N],y[N],t[N],ans=1e9,mp[M][M];
bool vis[M][M];
struct node{int x,y,t;}a[N];
queue<node>q;
bool cmp(node a,node b){return a.t<b.t;}
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
bool check(int x,int y){
if(x<1||x>M+1||y<1||y>M+1||vis[x][y]||mp[x][y]==1)return 0;
else return 1;
}
int bfs(int nx,int ny){
memset(vis,0,sizeof(vis));
for(int i=1;i<=M+1;++i){
for(int j=1;j<=M+1;++j){
if(mp[i][j]==1)mp[i][j]=0;
}
}
while(q.size())q.pop();
q.push({0,0,0});
while(q.size()){
node now=q.front();
q.pop();
for(int i=0;i<4;++i){
int xx=dx[i]+now.x;
int yy=dy[i]+now.y;
int l=0,r=n,mid;
while(l<=r){
mid=l+r>>1;
if(a[mid].t<now.t+1)l=mid+1;
else r=mid-1;
}
if(a[r].t==now.t+1){
mp[a[r].x][a[r].y]=1;
mp[a[r].x+1][a[r].y]=1;
mp[a[r].x-1][a[r].y]=1;
mp[a[r].x][a[r].y+1]=1;
mp[a[r].x][a[r].y-1]=1;
}
if(!check(xx,yy))continue;
q.push({xx,yy,now.t+1});
vis[xx][yy]=1;
if(xx==nx&&yy==ny)return now.t+1;
}
}
return 1e9;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].t);
mp[a[i].x][a[i].y]=2;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=M+1;++i){
for(int j=1;j<=M+1;++j){
if(mp[i][j]!=2)ans=min(ans,bfs(i,j));
}
}
if(ans==1e9)cout<<-1;
cout<<ans;
return 0;
}
by Dehydration @ 2023-04-18 18:37:43
for(int i=1;i<=M+1;++i){
for(int j=1;j<=M+1;++j){
if(mp[i][j]!=2)ans=min(ans,bfs(i,j));
你确定?最多可以达到900次bfs???
@2c_s
by Dehydration @ 2023-04-18 18:38:13
肯定是1次bfs!!!
by 厨神 @ 2023-04-19 13:31:09
跟普通的迷宫的区别就是,普通的迷宫只有走和不走两种情况。这个迷宫是限定了可以走的条件,即最早到达某个点的时间t[i][j],设定通过广搜走到某点的最早时间为a[i][j],当a[i][j]小于t[i][j]的时候,才可以通过i, j点进行下一步广搜。