【搜索】 HDU 3533 Escape BFS 预处理

来源:互联网 发布:淘宝智能客服 编辑:程序博客网 时间:2024/05/21 11:17

要从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!\n");        else printf("%d\n",ans);    }    return 0;}


0 0