poj之旅——3669

题意描述与解析:

有个小文青去看流星雨,不料流星掉下来会砸毁上下左右中五个点。每个流星掉下的位置和时间都不同,求小文青能否活命,如果能活命,最短的逃跑时间是多少?

思路:对流星雨排序,然后将地图的每个点的值设为该点最早被炸毁的时间。如果起点一开始就被炸毁了的话,那小文青就直接挂花,否则bfs。

参考程序:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
struct Meteor{
	int x,y,t;
};
typedef Meteor P;
bool visited[512][512];
int map[512][512],x[51002],y[51002],t[51002];
int N,last;
const int direction[5][2]={
	{1,0},
	{-1,0},
	{0,1},
	{0,-1},
	{0,0},
};
using namespace std;
int bfs(){
	memset(visited,0,sizeof(visited));
	queue<P> que;
	P current;
	current.x=0;
	current.y=0;
	current.t=0;
	que.push(current);
	while (que.size()){
		const P p=que.front();
		que.pop();
		for (int j=0;j<4;j++){
			current=p;
			current.x+=direction[j][0];
			current.y+=direction[j][1];
			current.t++;
			if (current.x >= 0 && current.y >= 0 && map[current.x][current.y] > current.t && !visited[current.x][current.y]){
				visited[current.x][current.y]=true;
				if (map[current.x][current.y]>last){
					return current.t;
				}
			    que.push(current);
			}
		}
	}
	return -1;
}
int main(){
	scanf("%d",&N);
	for (int i=0;i<N;i++)
		scanf("%d%d%d",&x[i],&y[i],&t[i]);
	memset(map,0x7F,sizeof(map));
	for (int i=0;i<N;i++){
		last=max(last,t[i]);
		for (int j=0;j<5;j++){
			int nx=x[i]+direction[j][0];
			int ny=y[i]+direction[j][1];
			if (nx>=0 && ny>=0)
				map[nx][ny]=min(t[i],map[nx][ny]);
		}
	}
	if (map[0][0]==0) printf("-1\n");
		else printf("%d\n",bfs());
	return 0;
}
时间: 2024-10-12 11:51:49

poj之旅——3669的相关文章

POJ 3669 Meteor Shower 题解 《挑战程序设计竞赛》

题目链接: http://poj.org/problem?id=3669 题意: 这个同学发现流星雨要来了,会对地球造成伤害于是决定逃跑.N颗流星会不定时降落在坐标轴第一象限300*300内的点上.给出每颗流星降落的坐标和时刻,求这个同学能否成功逃跑,能的话用时多少. 思路: 略有一点tricky,无法变通了(@﹏@)~.看了码农场的代码. 这道题没有给出地图,所以需要自己生成地图. 关键的点在于:在生成地图的时候,将每个点的初始值设为无穷大(表示不会有流星),将要被摧毁的点设置为流星降落的时刻

POJ No 3669 Meteor Shower_BFS搜索

#include <iostream> #include <cstring> #include <queue> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 500; const int INF = 50000000; int M; struct Meteor { int X, Y; int

POJ 3669 Meteor Shower【BFS】

POJ 3669 去看流星雨,不料流星掉下来会砸毁上下左右中五个点.每个流星掉下的位置和时间都不同,求能否活命,如果能活命,最短的逃跑时间是多少? 思路:对流星雨排序,然后将地图的每个点的值设为该点最早被炸毁的时间 #include <iostream> #include <algorithm> #include <queue> #include <cstring> using namespace std; #define INDEX_MAX 512 int

POJ 3669 Meteor Shower(流星雨)

POJ 3669 Meteor Shower(流星雨) Time Limit: 1000MS    Memory Limit: 65536K Description 题目描述 Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they hit. Anxious for her sa

POJ 2677 Tour 双调旅行商 dp, double+费用流

题目链接:点击打开链接 题意:给定二维平面上的n个点 从最左端点到最右端点(只能向右移动) 再返回到到最右端点(只能向左移动,且走过的点不能再走) 问最短路. 费用流: 为了达到遍历每个点的效果 把i点拆成 i && i+n 在i ->i+n 建一条费用为 -inf 的边,流量为1 这样跑最短路时必然会经过这条边,以此达到遍历的效果. dp :点击打开链接 对于i点 :只能跟一个点相连 -- 1.跟 i-1点相连 2.不跟i-1相连 用dp[i][j] 表示两个线头为 i 和 j 的

【POJ 3669 Meteor Shower】简单BFS

流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封锁).安全地带为永远不会被封锁的点. 简单bfs,开始WA在把平面空间上限当成300*300,但根据题目,这只是有流星雨撞击的范围.实际可走的空间理论上没上限,但分析可得,离原点最近的安全地带一定在(302,302)范围内,所以应可把数组至少开为303*303. 后来WA在把G[0][0]==1的情

poj 3311 Hie with the Pie 【旅行商+回原点】

题目:poj 3311 Hie with the Pie 题意:就是批萨点小二要送批萨,然后给你每个点的距离,有向的,然后让你就走一次回到原点的最短路. 分析:因为给出的是稠密图,所以要处理一下最短路,floyd 然后TSP就好. 枚举每个状态,对于当前状态的每一个已经走过的点,枚举是从那个点走过来的,更新最短路 状态:dp[st][i] :st状态下走到点 i 的最短路 转移方程:dp[st][i]=min(dp[st&~(1<<i)][j]+mp[j][i],dp[st][i]);

POJ - 3669 Meteor Shower(bfs)

题意:某人在时刻0从原点出发,在第一象限范围内移动.已知每个炸弹爆炸的地点和时刻,炸弹爆炸可毁坏该点和它上下左右的点.不能经过已毁坏的点,也不能在某点毁坏的时候位于该点.不会被炸弹毁坏的地方是安全之处,问某人到达安全之处的最短时间. 分析:bfs即可.注意:1.某点多次爆炸或受爆炸点影响而毁坏,取最早时间为该点的毁坏时间.2.bfs走过的点不能再走,注意标记. #pragma comment(linker, "/STACK:102400000, 102400000") #include

poj 3669 Meteor Shower(bfs)

Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they hit. Anxious for her safety, she vows to find her way to a safe location (one that is never destroy