• 【搜索】 HDU 3533 Escape BFS 预处理


    要从0,0 点 跑到m,n点  路上会有k个堡垒发射子弹。有子弹的地方不能走,子弹打到别的堡垒就会消失,或者一直飞出边界(人不能经过堡垒

    能够上下左右或者站着不动 每步都须要消耗能量  一共同拥有eng个能量

    先预处理出地图 用三维数组表示mp[x][y][time] time表示该时间的地图上储存不能走的点

    然后就是普通BFS

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <sstream>
    #include <math.h>
    using namespace std;
    #include <queue>
    #include <stack>
    #include <vector>
    #include <deque>
    #include <set>
    #include <map>
    #define cler(arr, val)    memset(arr, val, sizeof(arr))
    #define IN     freopen ("in.txt" , "r" , stdin);
    #define OUT  freopen ("out.txt" , "w" , stdout);
    typedef long long  LL;
    const int MAXN = 66666;//点数的最大值
    const int MAXM = 20006;//边数的最大值
    const int INF = 1101521204;
    const int mod = 10000007;
    int m,n,k,eng;
    struct node
    {
        int x,y,v,t,f;
    }kp[102];
    struct node1
    {
        int x,y,step;
    };
    queue<node1>q;
    int xx[5]={0,-1,1,0,0};
    int yy[5]={0,0,0,-1,1};
    bool vis[110][110][1009];
    bool mp[110][110][1009];
    bool point[110][110];
    bool inmp(int x,int y)
    {
        if(x<0||x>m||y<0||y>n) return false;
        return true;
    }
    int bfs(int x,int y)
    {
        node1 front,rear;
        front.x=x,front.y=y,front.step=0;
        while(!q.empty()) q.pop();
        q.push(front);
        while(!q.empty())
        {
            front=q.front();
            front.step++;
            q.pop();
            for(int i=0;i<5;i++)
            {
                int dx=front.x+xx[i],dy=front.y+yy[i];
                if(inmp(dx,dy)&&!mp[dx][dy][front.step]&&!point[dx][dy]&&!vis[dx][dy][front.step])
                {
                    vis[dx][dy][front.step]=true;
                    if(dx==m&&dy==n) return front.step;//到达终点
                    if(front.step+1>eng) continue;
                    rear.x=dx,rear.y=dy,rear.step=front.step;
                    q.push(rear);
                }
            }
        }
        return -1;
    }
    int main()
    {
       // IN;
        while(scanf("%d%d%d%d",&m,&n,&k,&eng)!=EOF)
        {
            cler(mp,false);
            cler(vis,false);
            cler(point,false);
            for(int i=0;i<k;i++)
            {
                char c[3];
                scanf("%s%d%d%d%d",c,&kp[i].t,&kp[i].v,&kp[i].x,&kp[i].y);
                if(c[0]=='N') kp[i].f=1;
                else if(c[0]=='S') kp[i].f=2;
                else if(c[0]=='W') kp[i].f=3;
                else if(c[0]=='E') kp[i].f=4;
                point[kp[i].x][kp[i].y]=true;
            }
            for(int i=0;i<k;i++)
            {
                int dx=kp[i].x,dy=kp[i].y,v=kp[i].v,next=kp[i].f;
                for(int j=1;j<=eng;j++)
                {
                    int flag=0;
                    dx+=xx[next],dy+=yy[next];
                    if(!inmp(dx,dy)) break;
                    for(int l=0;l<v;l++)//路上有堡垒
                    {
                        if(point[dx-xx[next]*l][dy-yy[next]*l])
                        {
                            flag=1;break;
                        }
                    }
                    if(flag) break;
                    int x=j;
                    while(x<=eng)
                    {
                        mp[dx][dy][x]=true;//标记不能走
                        x+=kp[i].t;
                    }
                }
            }
            int ans=bfs(0,0);
            if(ans==-1)
                printf("Bad luck!
    ");
            else printf("%d
    ",ans);
        }
        return 0;
    }
    


  • 相关阅读:
    ios数据处理 简单文件处理
    ios硬件开发 照相机图像选取器(UIImagePickerController)的用法
    ios UI设计与开发 卷动视图
    ios数据处理 使用SQLite保存学生信息
    ios数据处理 Application preferfences
    ios数据处理 SQLite基本知识
    GDI+ 为了阴影和透明,使用双层窗口遇到的一些问题
    MFC CToolTipCtrl 总是显示
    遍历删除文件夹及文件
    WebService远程调试
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6878852.html
Copyright © 2020-2023  润新知