• 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
  • 相关阅读:
    剑指offer 第十一天
    Java Arrays工具类的使用
    什么是指数加权平均、偏差修正?
    深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
    深度学习——卷积神经网络 的经典网络(LeNet-5、AlexNet、ZFNet、VGG-16、GoogLeNet、ResNet)
    深度学习论文汇总
    剑指offer 第十天
    Java String 类
    Java StringBuffer和StringBuilder类
    剑指offer 第九天
  • 原文地址:https://www.cnblogs.com/BMan/p/3238166.html
Copyright © 2020-2023  润新知