本题是一个BFS最短路问题,我们可以先把时刻的矩阵搞出来,哪些时刻哪些方块儿不能走用来剪枝
如果第一次走到永远不会被扎到的区域,那时候就是我们的最短距离
定义方向向量
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> PII;
const int N = 450,INF = 0x3f3f3f3f;
int t[N][N];
int dist[N][N];//记录距离
int dx[] = {0,-1,0,1};
int dy[] = {-1,0,1,0};
int bfs()
{
memset(dist,INF,sizeof dist);
queue<PII> q;
q.push({0,0});
dist[0][0] = 0;
if(t[0][0] == INF) return 0;
while(q.size())
{
auto p = q.front();q.pop();
int fx = p.first,fy = p.second;
for(int i = 0;i<4;i++)
{
int x = fx+dx[i],y=fy+dy[i];
if(x<0 || y<0) continue;
if(t[x][y] <= dist[fx][fy]+1)continue;
if(dist[x][y] != INF) continue;
if(t[x][y] == INF) return dist[fx][fy]+1;
dist[x][y] = dist[fx][fy]+1;
q.push({x,y});
}
}
return -1;
}
int main()
{
int m;cin >> m;
memset(t,INF,sizeof(t));
for(int i = 1;i<=m;i++)
{
int x,y,z;cin >> x >> y >> z;
t[x][y] = min(t[x][y],z);
for(int i = 0;i<4;i++)
{
int px = x+dx[i];
int py = y+dy[i];
if(px<0 || py <0) continue;
t[px][py] = min(t[px][py],z);
}
}//定义时刻矩阵
//接下来我们该bfs本矩阵了
cout << bfs() << endl;
return 0;
}