码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3669 Meteor Shower

时间:2015-08-17 21:34:57      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

POJ3669 Meteor Shower

贝斯冒着生命危险在坐标远点看流星雨,一个流星炸下来四周也炸了。为了不被炸死,他要跑到安全区域,他不能跑被炸过的区域,问他最快跑到安全区域的时间。

思路:流星雨落下的时间地点都不一样,如果动态的考虑脑子会炸(突然对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;
}

 

POJ3669 Meteor Shower

标签:

原文地址:http://www.cnblogs.com/xlsryj/p/4737496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!