题目链接:点击打开链接
用des数组保存每个格子被炸的最早时间,如果是inf就说明始终没被炸。在搜索时每次将当前格子的4个方向上合法的格子推入队列,如果走到始终没被炸的格子就说明已经到安全地址了,如果遇到没路走了的情况就输出-1
坑:虽然地图范围是300,但是301这个位置也是合法的,并且会影响300这个点,所以判断时要判断到300这个位置。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#define INF 10000000
#include <queue>
using namespace std;
int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int des[305][305];
int vis[305][305];
struct node{
int x,y,t;
node(){}
node(int x,int y,int t):x(x),y(y),t(t){}
};
bool C(node t){
if(vis[t.x][t.y]||t.x<0||t.y<0||t.x>301||t.y>301||t.t>=des[t.x][t.y])
return 0;
return 1;
}
int main(){
int M;
scanf("%d",&M);
for(int i=0;i<=301;i++){
for(int j=0;j<=301;j++){
des[i][j]=INF;
}
}
for(int i=1;i<=M;i++){
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
des[x][y]=min(des[x][y],t);
for(int i=0;i<4;i++){
int tx=x+dis[i][0];
int ty=y+dis[i][1];
if(tx>=0&&tx<=300&&ty>=0&&ty<=300)
des[tx][ty]=min(des[tx][ty],t);
}
}
queue <node> q;
bool flag=0;
int res;
q.push(node(0,0,0));
vis[0][0]=1;
while(!q.empty()){
node t=q.front();
if(des[t.x][t.y]==INF){
flag=1;
res=t.t;
break;
}
q.pop();
for(int i=0;i<4;i++){
node tmp=node(t.x+dis[i][0],t.y+dis[i][1],t.t+1);
if(C(tmp)){
q.push(tmp);
vis[tmp.x][tmp.y]=1;
}
}
}
if(flag) printf("%d",res);
else printf("-1");
return 0;
}