POJ 3669(BFS)

127 篇文章 0 订阅
85 篇文章 2 订阅

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 safety, she vows to find her way to a safe location (one that is never destroyed by a meteor) . She is currently grazing at the origin in the coordinate plane and wants to move to a new, safer location while avoiding being destroyed by meteors along her way.

The reports say that M meteors (1 ≤ M ≤ 50,000) will strike, with meteor i will striking point (Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300) at time Ti (0 ≤ Ti ≤ 1,000). Each meteor destroys the point that it strikes and also the four rectilinearly adjacent lattice points.

Bessie leaves the origin at time 0 and can travel in the first quadrant and parallel to the axes at the rate of one distance unit per second to any of the (often 4) adjacent rectilinear points that are not yet destroyed by a meteor. She cannot be located on a point at any time greater than or equal to the time it is destroyed).

Determine the minimum time it takes Bessie to get to a safe place.

Input

  • Line 1: A single integer: M
  • Lines 2..M+1: Line i+1 contains three space-separated integers: Xi, Yi, and Ti

Output

  • Line 1: The minimum time it takes Bessie to get to a safe place or -1 if it is impossible.

Sample Input

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

Sample Output

5

问题分析

题意:女主从坐标为(0,0)处开始逃亡,天上落下的陨石会会在某个时间点炸毁所降落的地点以及上下左右四个地点,问女主逃亡至少需要几秒,还是根本逃不掉(输出-1)。(女主只能在第一象限跑,被陨石炸过的地方不能走,每秒只能走一个单位)

解题思路:陨石的降落时间和炸毁地点都是固定的,那么我们就可以在输入的时候提前将陨石在几秒的时候会炸毁哪些地点,然后bfs去搜寻安全地点。

我们用一个map二维数组来表示地图,元素数值代表陨石会在几秒的时候降落。然后bfs的时候只要判断下一秒走到的地方是否为安全地区,那该怎么判断呢?当前已用时间再加上走到下一个单位所需要的时间和下一个单位陨石降落时间去比较,如果小于,就说明陨石还没掉下来,为安全区域。(就是要注意如果出发点0秒时就有陨石降落,女主将无法逃生)

ok,接下来是AC code(^_^)

//#include<bits/stdc++.h>
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const  int N = 5e4+3,M = 400;
int map[M][M], nxt[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
struct point{
    int x,y,t;
};
bool book[M][M];
int n, inf = 1e7;

int bfs()
{
    if(map[0][0]==0)//如果0秒时就有陨石落在出发地,那女主将无法逃生
        return -1;
    queue<point> q;
    point cur,nex;
    book[0][0] = true;
    cur.x = 0, cur.y = 0, cur.t = 0;
    q.push(cur);
    while(!q.empty())
    {
        cur = q.front();
        q.pop();
        if(map[cur.x][cur.y]==inf){
            return cur.t;
        }
        for(int i = 0; i < 4; ++i){
            nex.x = cur.x + nxt[i][0];
            nex.y = cur.y + nxt[i][1];
            if(nex.x<0||nex.y<0||nex.x>=M||nex.y>=M||book[nex.x][nex.y]==true)
                continue;
            nex.t = cur.t + 1;
            if(nex.t>=map[nex.x][nex.y])
                continue;
            //只有当前位置陨石还未降落时才可以走
            book[nex.x][nex.y] = true;
            q.push(nex);
        }
    }
    return -1;
}

void solve()
{
    int x,y,t;
    for(int i = 0; i < M; i ++)//我们将地图全部初始化为inf,表示都为安全区域
        fill(map[i], map[i] + M, inf);
    cin>>n;
    for(int i = 0; i < n; ++i){
        scanf("%d%d%d",&x,&y,&t);
        if(map[x][y]==inf)
        map[x][y] = t;
        for(int j = 0; j < 4; ++j){
            int tx = x+nxt[j][0];
            int ty = y+nxt[j][1];
            if(tx>=0&&ty>=0&&tx<M&&ty<M&&t<map[tx][ty])//已经被炸过的不可以走,所以优先显示时间小的
                map[tx][ty] = t;
        }
    }
    cout<<bfs()<<endl;
}

int main()
{
    solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值