1. 程式人生 > >【搜索】 HDU 3533 Escape BFS 預處理

【搜索】 HDU 3533 Escape BFS 預處理

cap 擁有 ace deque i++ const tdi code -m

要從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;
}


【搜索】 HDU 3533 Escape BFS 預處理