C++用BFS广度优先搜索解POJ_3669_Meteor Shower问题

news/2024/12/22 1:49:35/

POJ3669 Meteor Shower

题目链接:
POJ3669 Meteor Shower

简单理解一下题目:
张三遇到了流星雨,他所在的地方被划分成很多个方格,有的方格会在某一时刻被流星雨砸中,张三必须尽快移动到一个永远不会被流星雨砸中的方格里,每个流星砸中某一方格时,也会同时砸中这个方格周围上下左右四个方向的方格。求张三移动到安全方格所需的最短时间。

看一下输入:

4
0 0 2
2 1 2
1 1 2
0 3 5

输入第一行是流星雨的数量n,后面n行是每个流星雨的坐标以及砸中的时间,我的处理方法是,建立二维数组,二维数组的下标代表方格的横纵坐标,值代表被流星雨砸中的时间,对于输入的每个流星,更新该流星砸中的方格的安全时间(取最小值),同时更新该方格四个方向的方格。

解题思路:
用广度优先搜索,每到一个新的方格,依次遍历左下右上四个方向的方格,然后再依次去这四个方格进行搜索。我用的是队列queue,先进先出,可以保证先搜索先进去的状态,然后生成的状态也放入队列中,这种结构就能够保证在前面搜索到的安全地带一定是花费了最少的时间到达的。

AC代码:

#include<iostream>
#include<cstring>
#include<queue>using namespace std;const int MAX_N = 302;
const int INF = 1e9;
typedef pair<int, int>P;int M;
int meteor[MAX_N][MAX_N];
int ti;//表示当前时间
int dx[4] = { -1,0,1,0 };//左,下,右,上
int dy[4] = { 0,-1,0,1 };
int time_[MAX_N][MAX_N];//记录到达某个方格的最短时间queue<P>que;void solve() {if (meteor[0][0] == 0) {cout << -1 << endl;return;}time_[0][0] = 0;que.push(P(0, 0));while (!que.empty()) {P p = que.front();que.pop();if (meteor[p.first][p.second] == INF) {cout << time_[p.first][p.second] << endl;return;}for (int i = 0; i < 4; i++) {int nx = p.first + dx[i];int ny = p.second + dy[i];if (nx >= 0 && nx < MAX_N && ny >= 0 && ny<MAX_N && time_[nx][ny] == INF && meteor[nx][ny] > time_[p.first][p.second] + 1) {que.push(P(nx, ny));time_[nx][ny] = time_[p.first][p.second] + 1;}}}cout << -1 << endl;return;
}int main() {cin >> M;int x, y, t;for (int i = 0; i < MAX_N; i++) {for (int j = 0; j < MAX_N; j++) {meteor[i][j] = INF;//初始化为无穷大,表示都不会被砸到time_[i][j] = INF;}}for (int i = 0; i < M; i++) {cin >> x >> y >> t;meteor[x][y] = min(t, meteor[x][y]);//更新最小的安全时间for (int i = 0; i < 4; i++) {//相邻四个方向的方格也要更新int nx = x + dx[i];int ny = y + dy[i];if (nx >= 0 && nx < MAX_N && ny >= 0 && ny < MAX_N) {meteor[nx][ny] = min(t, meteor[nx][ny]);}}}solve();return 0;
}/*
4
0 0 2
2 1 2
1 1 2
0 3 5
*/

http://www.ppmy.cn/news/131401.html

相关文章

poj-3669 Meteor Shower

[题目链接] 有个小文青去看流星雨&#xff0c;不料流星掉下来会砸毁上下左右中五个点。每个流星掉下的位置和时间都不同&#xff0c;求小文青能否活命&#xff0c;如果能活命&#xff0c;最短的逃跑时间是多少&#xff1f; 思路&#xff1a;对地图进行预处理一下&#xff0c;每…

【POJ3669】Meteor Shower 题解

http://poj.org/problem?id3669 题意 有 M M M 个流星即将落到地球上。其中&#xff0c;第 i i i 个会在 T i T_i Ti​ 时落在 ( X i , Y i ) (X_i, Y_i) (Xi​,Yi​) ( 0 ≤ X i , Y i ≤ 300 ) (0\le X_i,Y_i \le 300) (0≤Xi​,Yi​≤300) 处&#xff0c;落地后&…

POJ3669 Meteor Shower 题解

博客园同步 原题链接 题目不难。 肯定考虑宽搜。 首先搞定一个事实&#xff1a;一个格子不会重复走。如果可以重复走&#xff0c;则必然有可以替代它的不重复走的不劣的方案。很明显&#xff1a;如果你走到一个格子又 可以不 走回来&#xff0c;那就有了替代方案&#xff1…

3669

/* 宽度优先搜索啥时候才能杜绝小错误呢&#xff0c;以后ij一定不在搞混了 */// include file #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <cctype> #include <ctime>#include <iostream>…

bzoj 3669 魔法森林

3669: [Noi2014]魔法森林 Time Limit: 30 Sec Memory Limit: 512 MB Submit: 2690 Solved: 1667 [ Submit][ Status][ Discuss] Description 为了得到书法大家的真传&#xff0c;小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个N节点M条边的无向…

poj3669 bfs

流星雨来袭击我们的女主牛了&#xff0c;Bessie。为了找一个安全地方&#xff0c;她开始逃了。地图相当于平面坐标系第一象限&#xff0c;Bessie一开始在原点。然后&#xff0c;每颗流星都会在某个时刻砸下来&#xff0c;砸到的地方连同上下左右都会被毁灭&#xff0c;此时这些…

【题解】POJ 3669 Meteor Shower(BFS)

POJ 3669 Meteor Shower https://vjudge.net/problem/POJ-3669 题意 有一场流星雨即将到来&#xff0c;Bessie要找到一个安全的地方。现在已知有M颗流星&#xff0c;并且知道它们抵达的位置和时间&#xff0c;Bessi走一个单位需要一个单位时间&#xff0c;问到达安全位置的最短…

poj3669

题意&#xff1a;巨大流星雨即将袭来。每个流星会对击中的地方以及周围&#xff08;上下左右四格&#xff09;造成破坏。Bessie开始时位于&#xff08;0, 0&#xff09;位置&#xff0c;并希望逃到一处不会被袭击到的地方&#xff08;在第一象限内&#xff09;。已知每移动一格…