原题是洛谷P2895
题目描述
贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。
如果将牧场放入一个直角坐标系中,贝茜现在的位置是原点,并且,贝茜不能踏上一块被流星砸过的土地。
根据预报,一共有 M 颗流星 (1≤M≤50,000) 会坠落在农场上,其中第 i 颗流星会在时刻 Ti 砸在坐标为 (Xi,Yi)(0≤Xi≤300, 0≤Yi≤300) 的格子里。流星的力量会将它所在的格子,以及周围 4 个相邻的格子都化为焦土,当然贝茜也无法再在这些格子上行走。
贝茜在时刻 0 开始行动,它只能在第一象限中,平行于坐标轴行动,每 1 个时刻中,她能移动到相邻的(一般是 4 个)格子中的任意一个,当然目标格子要没有被烧焦才行。如果一个格子在时刻 t 被流星撞击或烧焦,那么贝茜只能在 t 之前的时刻在这个格子里出现。 贝西一开始在 (0,0)。
请你计算一下,贝茜最少需要多少时间才能到达一个安全的格子。如果不可能到达输出 −1。
输入格式
共 M+1 行,第 1 行输入一个整数 M,接下来的 M 行每行输入三个整数分别为 Xi,Yi,Ti。
输出格式
贝西到达安全地点所需的最短时间,如果不可能,则为 −1。
输入输出样例
输入 #1
4 0 0 2 2 1 2 1 1 2 0 3 5输出 #1
5
#include <cstdio>
#include <iostream>
#include <cstring>
using std::cout;
using std::cin;
int m;
int map[310][310],lx[310][310],vis[310][310],time[310][310];
//map中的数代表该位置多久后会因陨石袭击无法通行 若值为-1表示此地是安全地点
//lx表示此地多久后会落下流星 初值为0不影响 后面是按照陨石落点查询该数组
//vis值为1表示已经走过
//time表示到达此地所需的最短时间
const int dx[]={0,0,1,-1,0};
const int dy[]={1,-1,0,0,0};
struct Node{
int x,y;
}q[91000];
void bfs(int a,int b){
int head=0,tail=1;
q[1].x=a;q[1].y=b;vis[a][b]=1;
while(head<tail){
head++;
for(int i=0;i<4;i++){
int xx=q[head].x+dx[i];