浣熊市下水道 Gym - 102072K (bfs)

多开一维记录当前僵尸的状况

k<10 所以僵尸的状况最多为 k*2-2  18种

每次到僵尸的路径上时,判断一下是否可行即可

这里我在记录僵尸路径 直接对应了一下僵尸的状况;

  

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))

const int maxn=505;

int vis[505][505][20];
int nmap[505][505];
int n,m,p,k,mod;
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int ex,ey,sx,sy;

struct node{
    int x,y,dep;
};

void work()
{
    int x,y;
    string s;
    cin>>x>>y>>s;
    if(s=="UP")
    {
        for(int i=0;i<=k;i++)
            nmap[x-i][y]=i+1;
    }
    if(s=="DOWN")
    {
        for(int i=0;i<=k;i++)
            nmap[x+i][y]=i+1;
    }
    if(s=="LEFT")
    {
        for(int i=0;i<=k;i++)
            nmap[x][y-i]=i+1;
    }
    if(s=="RIGHT")
    {
        for(int i=0;i<=k;i++)
            nmap[x][y+i]=i+1;

    }
}

int cheek(int x,int y,int dep)
{
    if(nmap[x][y]==-1)
        return 0;
    if(nmap[x][y]==0)
        return 1;
    dep%=mod;
    if(dep==0) dep=mod;
    if(nmap[x][y]==dep||nmap[x][y]==2*(k+1)-dep)
        return 0;
    return 1;
}

int bfs(int x,int y)
{
    int dep=1,ans=inf;
    queue<node>q;
    vis[x][y][1]=1;
    q.push((node){x,y,1});
    while(!q.empty())
    {
        x=q.front().x;
        y=q.front().y;
        dep=q.front().dep;
        q.pop();
        if(x==ex&&y==ey)
        {
            ans=dep;
            break ;
        }
        for(int i=0;i<4;i++)
        {
            int xx=x+dx[i],yy=y+dy[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&cheek(xx,yy,dep+1)&&!vis[xx][yy][(dep+1)%mod])
            {
                q.push((node){xx,yy,dep+1});
                vis[xx][yy][(dep+1)%mod]=1;
            }
        }
    }
    return ans;
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&p,&k);
    mod=k*2-2;
    k--;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            char ch;
            cin>>ch;
            if(ch=='&') nmap[i][j]=-1;
            if(ch=='A') ex=i,ey=j;
            if(ch=='L') sx=i,sy=j;
        }
    }
    for(int i=1;i<=p;i++)
        work();
    int ans=bfs(sx,sy);
    if(ans==inf) cout<<"You are Dead!\n";
    else cout<<ans-1<<"\n";
    return 0;
}

 

posted @ 2019-07-26 15:44  Minun  阅读(143)  评论(0编辑  收藏  举报