流星雨的题解

贝茜听说了一个骇人听闻的消息:一场流星雨即将袭击整个农场,由于流星
体积过大,它们无法在撞击到地面前燃烧殆尽,届时将会对它撞到的一切东西
造成毁灭性的打击。很自然地,贝茜开始担心自己的安全问题。以 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;
}
发布了110 篇原创文章 · 获赞 188 · 访问量 7117

猜你喜欢

转载自blog.csdn.net/qq_46230164/article/details/105467033