贝茜听说了一个骇人听闻的消息:一场流星雨即将袭击整个农场,由于流星
体积过大,它们无法在撞击到地面前燃烧殆尽,届时将会对它撞到的一切东西
造成毁灭性的打击。很自然地,贝茜开始担心自己的安全问题。以 FJ 牧场中最
聪明的奶牛的名誉起誓,她一定要在被流星砸到前,到达一个安全的地方(也就
是说,一块不会被任何流星砸到的土地)。如果将牧场放入一个直角坐标系中,
贝茜现在的位置是原点,并且,贝茜不能踏上一块被流星砸过的土地。
根据预报,一共有 M 颗流星(1 <= M <= 50,000)会坠落在农场上,其中第 i 颗
流星会在时刻 T_i (0 <= T_i <= 1,000)砸在坐标为(X_i, Y_i)
(0 <= X_i <= 300;0 <= Y_i <= 300)的格子里。流星的力量会将它所在的格子
,以及周围 4 个相邻的格子都化为焦土,当然贝茜也无法再在这些格子上行走。
贝茜在时刻 0 开始行动,它只能在第一象限中,平行于坐标轴行动,每 1 个时刻中,
,她能移动到相邻的(一般是 4 个)
格子中的任意一个,当然目标格子要没有被烧焦才行。如果一个格子在时刻 t 被
流星撞击或烧焦,那么贝茜只能在 t 之前的时刻在这个格子里出现。
请你计算一下,贝茜最少需要多少时间才能到达一个安全的格子。
传统的搜索
应该没什么问题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &FF){
T RR=1;FF=0;char CH=getchar();
for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
FF*=RR;
}
template<typename T>inline void write(T x){
if(x<0)putchar('-'),x*=-1;
if(x>9)write(x/10);
putchar(x%10+48);
}
template<typename T>inline void writen(T x){
write(x);
puts("");
}
int n,a[1010][1010],h[1010][1010],xx;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
void work(int x,int y,int t){
a[x][y]=min(a[x][y],t);
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx>=0&&ty>=0)a[tx][ty]=min(a[tx][ty],t);
}
}
queue<int>x;
queue<int>y;
queue<int>s;
int main(){
memset(a,0x3f,sizeof(a));xx=a[0][0];
read(n);
for(int i=1;i<=n;i++){
int x,y,t;
read(x),read(y),read(t);
work(x,y,t);
}h[0][0]=1;
x.push(0);
y.push(0);
s.push(0);
while(x.size()){
for(int i=0;i<4;i++){
int tx=x.front()+dx[i],ty=y.front()+dy[i];
if(tx>=0&&ty>=0&&s.front()+1<a[tx][ty]&&!h[tx][ty]){
h[tx][ty]=1;
if(a[tx][ty]==xx){
cout<<s.front()+1;
return 0;
}
x.push(tx);
y.push(ty);
s.push(s.front()+1);
}
}
x.pop();
y.pop();
s.pop();
}puts("-1");
return 0;
}