POJ - 3669Meteor Shower(bfs)
Posted sky-stars
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 3669Meteor Shower(bfs)相关的知识,希望对你有一定的参考价值。
-->Meteor Shower
直接上中文了
Descriptions:
Bessie听说有场史无前例的流星雨即将来临;有谶言:陨星将落,徒留灰烬。为保生机,她誓将找寻安全之所(永避星坠之地)。目前她正在平面坐标系的原点放牧,打算在群星断其生路前转移至安全地点。
此次共有M (1 ≤ M ≤ 50,000)颗流星来袭,流星i将在时间点Ti (0 ≤ Ti ≤ 1,000) 袭击点 (Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300)。每颗流星都将摧毁落点及其相邻四点的区域。
Bessie在0时刻时处于原点,且只能行于第一象限,以平行与坐标轴每秒一个单位长度的速度奔走于未被毁坏的相邻(通常为4)点上。在某点被摧毁的刹那及其往后的时刻,她都无法进入该点。
寻找Bessie到达安全地点所需的最短时间。
Input
* 第2..M+1行: 第i+1行包含由空格分隔的三个整数: Xi, Yi, and Ti
Output
* 仅一行: Bessie寻得安全点所花费的最短时间,无解则为-1。
Sample Input
4 0 0 2 2 1 2 1 1 2 0 3 5
Sample Output
5
题目链接:
https://vjudge.net/problem/POJ-3669
题目没给地图,但是自己要会做地图
题目要求的是流星坐标(0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300),而人的坐标只能行于第一象限,所以人可以X>300,Y>300
首先把流星落到(x,y)的时间全部展现在地图mp[i][j]中,然后人从(0,0)开始出发,dfs,找到没有落流星的地方即可
AC代码:
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <sstream> #define mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x,y) memset(x,y,sizeof(x)) #define Maxn 310 using namespace std; struct node int x,y,t;//坐标,时间 ; node now,net; queue<node>q; int m; int x,y,t; int mp[Maxn][Maxn];//存每一个坐标的时间 int dt[][2]= 1,0,-1,0,0,1,0,-1,0,0;//连带即自己5个方向 int bfs() if(mp[0][0]==-1)//起始点没落过流星,这里安全,不用走 return 0; if(mp[0][0]==0)//起始点在时间t=0时就被落过流星,没开始走就挂了 return -1; now.x=0,now.y=0,now.t=0;//初始化起点 q.push(now); while(!q.empty()) now=q.front(); q.pop(); for(int i=0;i<4;i++)//人走四个方向 net.x=now.x+dt[i][0]; net.y=now.y+dt[i][1]; net.t=now.t+1; if(net.t<0||net.y<0)//题目要求人只能行于第一象限,即x和y可以大于300 continue; if(mp[net.x][net.y]==-1)//这里没落过流星 安全 不用走了 return net.t; if(net.t>=mp[net.x][net.y])//到这里的时间>=流星落在这里的时间,不安全 continue; mp[net.x][net.y]=net.t;//到这里的时间<流星落在这里的时间,暂时安全,还要继续走 q.push(net); return -1; int main() MEM(mp,-1); cin>>m; while(m--) cin>>x>>y>>t; for(int i=0;i<5;i++)//mp存放每个流星落点附近点的时间最小值 int tx=x+dt[i][0]; int ty=y+dt[i][1]; if(tx<0||tx>300||ty<0||ty>300)//题目要求(0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300) continue; if(mp[tx][ty]==-1)//没落过流星 mp[tx][ty]=t; else//已经有过流星,取最小值 mp[tx][ty]=min(t,mp[tx][ty]); cout<<bfs()<<endl;
以上是关于POJ - 3669Meteor Shower(bfs)的主要内容,如果未能解决你的问题,请参考以下文章
poj3669 Meteor Shower (宽度优先搜索)