#include <iostream>
#include <queue>
using namespace std;
int m;
int danger[305][305];
void add(int x,int y,int t)
{
danger[x][y]=t;
if(x>0) danger[x-1][y]=t;
if(y>0) danger[x][y-1]=t;
danger[x+1][y]=danger[x][y+1]=t;
}
struct node
{
int x,y,dis;
};
bool vis[305][305];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
queue<node> q;
int bfs()
{
q.push({0,0,0});
vis[0][0]=1;
while(!q.empty())
{
node now=q.front();
q.pop();
if(danger[now.x][now.y]==(-1))
{
return now.dis;
}
for(int i=0;i<4;i++)
{
int tx=now.x+dir[i][0];
int ty=now.y+dir[i][1];
if(tx>=0&&ty>=0&&tx<=300&&ty<=300)
{
if(!vis[tx][ty]&&(danger[tx][ty]==(-1)||danger[tx][ty]>now.dis+1))
{
vis[tx][ty]=1;
q.push({tx,ty,now.dis+1});
}
}
}
}
return -1;
}
int main()
{
for(int i=0;i<=300;i++)
{
for(int j=0;j<=300;j++) danger[i][j]=(-1);
}
cin>>m;
for(int i=1;i<=m;i++)
{
int x,y,t;
cin>>x>>y>>t;
add(x,y,t);
}
cout<<bfs();
return 0;
}
评测记录:https://www.luogu.com.cn/record/184198176
思路:
题目意思简单来说就是有的格子会在特定时间之后变为墙,要去到一个不会变成墙的格子,因此bfs即可
谢谢!