BFS:Meteor Shower(POJ 3669)

                 

                  奔跑吧,傻牛

  题目大意:这只Bessie的牛又要来闹事了,这次她的任务就是来躲流星雨,流星雨就是在一定时间会从天上砸到Bessie的所在的正方形区域内(Bessie在0,0的位置),然后砸下来后流星雨会把区域内的上下左右区域全部砸烂,并且砸烂后Bessie不能再到这里,Bessie也不能在流星雨打击的地方呆着(也就是只能在流星雨要下来的时间之前才能在这里),问你Bessie要走多少步才能到安全区域

  这一道题好玩,我们这样想,Bessie走过的路就是等值的(也就是每走一步都是1),而且还要要求你在矩阵内走,那么这一题很明显就是要你用BFS了

  但是关键的问题是,陨石不是一下子全部掉落下来的,而是有时间间隔的,那有这么一个思路,我们可以在一定区域时间内看牛能走到哪里,然后下一波流星雨,毁掉能走掉的部分区域,然后在下一波,这样我们只用保存最小的那一些路就可以了,但是这样的话显然是不现实的,因为有时候流星雨砸很长时间,但是一直砸不到某个区域,我们做的很多工作都是白费的,交题绝对TLE,不要问我为什么知道

  所以我们要换一种思路,既然流星雨都会砸下来,那么我们为什么不直接先假设让流星雨先全部砸下来看剩下多少安全区域呢???(这是一种很好的思想,以后会经常用到),但是因为流星雨砸下来是有时间区分的,所以我们要保留流星雨砸下来的时间,然后从0,0开始BFS,如果BFS所用的步数不足以到达安全区域,那么就判断无法到达,如果能到到安全区域,那么第一次到达就肯定是最短的距离了(BFS的特性),

  另外,还要注意,我们每次扫过位置以后,一定要对位置进行标记,可以使用known区域,但是一定要注意,一定要把四个方位区域全部标记上,而不是只标记出队的那个点,不这样做的话,重复会非常多,会TLE,或者直接把map写上当前最短距离,然后进行判断就可以了

  另外一个小问题,就是以后不要把数组初始化为大值了。。。。要么初始化为0,要么-1,不然会莫名其妙多很多时间。。。

  

 1 #include <iostream>
 2 #include <functional>
 3 #include <algorithm>
 4 #include <queue>
 5 #define MAX_N 310
 6 #define MIN(a,b) a<b?a:b
 7
 8 using namespace std;
 9
10 void Search(const int);
11 void Inivilize_dir(void);
12
13 pair<int, int>dir[4];
14 static int dp[MAX_N + 1][MAX_N + 1];
15 static int map[MAX_N + 1][MAX_N + 1];
16
17 void Inivilize_dir(void)
18 {
19     dir[0].first = -1; dir[0].second = 0;
20     dir[1].first = 1; dir[1].second = 0;
21     dir[2].first = 0; dir[2].second = -1;
22     dir[3].first = 0; dir[3].second = 1;
23 }
24
25 int main(void)
26 {
27     int M, tx, ty, drop_time,ttx, tty;
28     Inivilize_dir();
29     while (~scanf("%d", &M))
30     {
31         memset(map, -1, sizeof(map));
32
33         for (int i = 0; i < M; i++)
34         {
35             scanf("%d%d%d", &tx, &ty, &drop_time);
36             if (map[tx][ty] != -1)
37                 map[tx][ty] = MIN(map[tx][ty], drop_time);//最早炸毁时间
38             else map[tx][ty] = drop_time;
39             for (int j = 0; j < 4; j++)//周围四个点都要
40             {
41                 ttx = tx + dir[j].first;  tty = ty + dir[j].second;
42                 if (ttx >= 0 && ttx <= MAX_N
43                     && tty >= 0 && tty <= MAX_N//坐标在矩阵内
44                     )
45                     if (map[ttx][tty] != -1)
46                         map[ttx][tty] = MIN(map[ttx][tty], drop_time);
47                     else map[ttx][tty] = drop_time;
48             }
49         }
50         if (map[0][0] == 0)
51             cout << -1 << endl;
52         else if (map[0][0] == -1)//开始都打不到还考虑什么,不动
53             cout << 0 << endl;
54         else Search(M);
55     }
56     return 0;
57 }
58
59 void Search(const int M)
60 {
61     int ttx, tty, tx, ty;
62     queue<pair<int, int>>que;
63     pair<int, int>tmp, d_tmp;
64     que.push(tmp);
65     while (!que.empty())
66     {
67         tmp = que.front(); que.pop();
68         tx = tmp.first; ty = tmp.second;
69
70         for (int j = 0; j < 4; j++)
71         {
72             ttx = tx + dir[j].first;  tty = ty + dir[j].second;
73             if (ttx >= 0 && ttx <= MAX_N
74                 && tty >= 0 && tty <= MAX_N//坐标在矩阵内
75                 )
76             {
77                 if (map[ttx][tty] == -1)//如果找到安全位置,则更新最短距离
78                 {
79                     cout << dp[tx][ty] + 1 << endl;
80                     return;
81                 }
82                 if (dp[tx][ty] + 1 <= map[ttx][tty] - 1)//如果都比这个时间大,那肯定被炸死了
83                 {
84                     dp[ttx][tty] = dp[tx][ty] + 1;
85                     d_tmp.first = ttx; d_tmp.second = tty;
86                     que.push(d_tmp);//还在时间之内,入队
87                     map[ttx][tty] = dp[ttx][tty];
88                     //不能用known去标记入口,除非是标记所有的点
89                 }
90             }
91         }
92     }
93     cout << -1 << endl;
94 }
时间: 2024-10-11 00:24:34

BFS:Meteor Shower(POJ 3669)的相关文章

Meteor Shower (poj 3669 bfs)

Language: Default Meteor Shower Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9929   Accepted: 2771 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destro

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(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

POJ 3669 Meteor shower 简单BFS, 有坑点

Meteor Shower 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

POJ 3669 Meteor Shower (BFS + 预处理)

Meteor Shower Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9677   Accepted: 2718 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they hi

【POJ - 3669】Meteor 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).每颗流星都将摧毁落点及其相邻四点的区

题解报告: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

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 3669 Meteor Shower

Meteor Shower Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16339   Accepted: 4293 Description Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will crash into earth and destroy anything they h