标签:
贝斯冒着生命危险在坐标远点看流星雨,一个流星炸下来四周也炸了。为了不被炸死,他要跑到安全区域,他不能跑被炸过的区域,问他最快跑到安全区域的时间。
思路:流星雨落下的时间地点都不一样,如果动态的考虑脑子会炸(突然对QQ堂的编程者有了崇高的敬意),所以换个考虑方式,将每个点设置为最早炸掉的时间。恩恩不错。如果原点在0时被炸,贝斯直接死翘翘。
#include <iostream> #include <algorithm> #include <queue> #include <cstring> using namespace std; #define INDEX_MAX 512 int map[INDEX_MAX][INDEX_MAX]; bool visited[INDEX_MAX][INDEX_MAX]; struct Meteor { int x, y, t; }; //用typedef表示结构更为方便 typedef Meteor P; Meteor m[50008]; int n; //因为一个流星雨炸掉毁五个格子,所以带上(0,0) const int direction[5][2] = { { -1, 0 },{ 1, 0 },{ 0, -1 },{ 0, 1 }, { 0, 0 },}; //用来表示地图上最后爆炸的时间 int last; 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 = current.x + direction[j][0]; current.y = 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); } } } //所有循环都结束还不行就返回-1。有时可以在函数里直接设置 return -1; } int main() { cin >> n; for (int i = 0; i < n; ++i) { cin >> m[i].x >> m[i].y >> m[i].t; } // 地图中每个点的值表示最早在什么时候被炸毁 memset(map, 0x7F, sizeof(map)); for (int i = 0; i < n; ++i) { //设置每个点的值为爆炸时间 , 最后爆炸时间 last = max(last, m[i].t); for (int j = 0; j < 5; ++j) { int nx = m[i].x + direction[j][0]; int ny = m[i].y + direction[j][1]; if (nx >= 0 && ny >= 0 && map[nx][ny] > m[i].t) { map[nx][ny] = m[i].t; } } } //考虑地图原点开始就炸的情况 if (map[0][0] == 0) { cout << -1 << endl; } else { cout << bfs() << endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/xlsryj/p/4737496.html