本题是一个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;
}