您的位置:首页 > 其它

刷题——Meteor Shower POJ - 3669

2017-08-14 10:15 204 查看
/*

给定撞击点和撞击时间

求从0,0点开始到到达为摧毁地点的最小时间,若无法到达安全地点则输出-1

被撞击点的上下左右中五个点都会被摧毁

设为被撞击的点为-1,被撞击点设为最早被撞击时间

从0,0开始遍历,找到最快到达的-1点

*/

#include <stdio.h>

#include <string.h>

#include <queue>

#include <iostream>

using namespace std;

typedef pair<int,int>P;

int a[305][305];

int dx[]={0,1,0,-1,0};

int dy[]={1,0,-1,0,0};

bool vis[305][305];

int d[305][305];

void zj(int x,int y,int t){

    if(x>=0&&y>=0){

        if(a[x][y]==-1){

            a[x][y]=t;

        }

        else if(a[x][y]>t){

            a[x][y]=t;

        }

    }

}

void bfs(){

    queue<P>que;

    que.push(P(0,0));

    memset(vis,false,sizeof(vis));

    memset(d,0,sizeof(d));

    vis[0][0]=true;

    while(!que.empty()){

        P p=que.front();

        que.pop();

        int x=p.first;

        int y=p.second;

        if(a[x][y]==-1){

            printf("%d\n",d[x][y]);

            return;

        }

        for(int i=0;i<4;i++){

            int tx=x+dx[i];

            int ty=y+dy[i];

            if(tx>=0&&ty>=0&&!vis[tx][ty]&&(d[x][y]+1<a[tx][ty]||a[tx][ty]==-1)){

                que.push(P(tx,ty));

                vis[tx][ty]=true;

                d[tx][ty]=d[x][y]+1;

            }

        }

    }

    printf("-1\n");

}

int main(){

    int n;

    while(~scanf("%d",&n)){

        memset(a,-1,sizeof(a));

        int x,y,t;

        for(int i=0;i<n;i++){

            scanf("%d %d %d",&x,&y,&t);

            for(int j=0;j<5;j++)

            zj(x+dx[j],y+dy[j],t);

        }

        bfs();

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: