zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    20155322 2017-2018-1《信息安全系统设计》第七周学习总结
    20155322 2017-2018-1《信息安全系统设计》实验二:固件程序设计
    20155322 2017-2018-1《信息安全系统设计》第六周学习总结
    20155322 2017-2018-1《信息安全系统设计》第六周 课下作业
    01--DNS服务器1
    华为lab-rs-v1-2.5_流量优化
    华为lab-rs-v1-2.4_OSPF提升
    华为lab-rs-v1-2.3_OSPF基础
    华为lab-rs-v1-2.2_RIP基础
    华为lab-rs-v1-2.1_IP基础
  • 原文地址:https://www.cnblogs.com/BMan/p/3238166.html
Copyright © 2011-2022 走看看