POJ 3669 Meteor Shower BFS

题意:

M个陨石会在某个时间砸向地图某点,摧毁该点及其上下左右总共五个格子,也就是在这个时间以后这些格子就不能通过了,问主人公从(0,0)开始最少需要多少时间能到达安全的地方(也就是一直不会被摧毁的地方)

此题有个小陷阱,with meteor i will striking point (Xi, Yi) (0 ≤ X≤ 300; 0 ≤ Y≤ 300) at time Ti (0 ≤ Ti  ≤ 1,000). 这里的X、Y指的是陨石的范围而不是地图的范围,地图是一张无限大的,也就是可以走到300以外地方。

先初始化所以格子的崩塌时间为INF(无限大),然后预处理出所有的时间,再跑一遍BFS就行了

// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<sstream>
#include<cmath>
#include<climits>
#include<string>
#include<map>
#include<queue>
#include<vector>
#include<stack>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define pb(a) push_back(a)
#define INF 0x1f1f1f1f
#define lson idx<<1,l,mid
#define rson idx<<1|1,mid+1,r

void debug()
{
#ifdef ONLINE_JUDGE
#else
    freopen("d:\in.txt","r",stdin);
    freopen("d:\out1.txt","w",stdout);
#endif
}
char getch()
{
    char ch;
    while((ch=getchar())!=EOF)
    {
        if(ch!=' '&&ch!='
')return ch;
    }
    return EOF;
}
int da[310][310];//存放崩塌时间int vis[310][310];
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
struct point
{
    int x,y,t;
};
int bfs()
{
    queue<point> q;
    q.push((point){0,0,0});
    while(!q.empty())
    {
        point p=q.front();q.pop();
        if(da[p.x][p.y]==INF)return p.t;
        if(vis[p.x][p.y])continue;
        vis[p.x][p.y]=1;
        for(int d=0;d<4;d++)
        {
            point np;
            np.x=p.x+dx[d];np.y=p.y+dy[d];np.t=p.t+1;
       //边界要大于等于302            if(np.x>=0&&np.x<=305&&np.y>=0&&np.y<=305&&da[np.x][np.y]>np.t&&!vis[np.x][np.y])
            {
                q.push(np);
            }
        }
    }
    return -1;
}
int main()
{
    int m;
    while(scanf("%d",&m)!=EOF)
    {
     //预处理部分        memset(da,INF,sizeof(da));        for(int i=1;i<=m;i++)
        {
            int x,y,t;
            scanf("%d%d%d",&x,&y,&t);
            if(da[x][y]>t)da[x][y]=t;
            for(int d=0;d<4;d++)
            {
                int nx=x+dx[d],ny=y+dy[d];                if(nx>=0&&nx<=305&&ny>=0&&ny<=305&&da[nx][ny]>t)da[nx][ny]=t;
             }
        }
        memset(vis,0,sizeof(vis));
        int flag=bfs();
        printf("%d
",flag);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/BMan/p/3238166.html