• 浣熊市下水道 Gym


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

    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!
    ";
        else cout<<ans-1<<"
    ";
        return 0;
    }
  • 相关阅读:
    (win10 64位系统中)Visual Studio 2015+OpenCV 3.3.0环境搭建,100%成功
    flutter环境搭建
    并发
    java集合继承关系图
    java中反射的使用
    android使用http3
    java之结合代码理解synchronized关键字
    阿里云ECS服务器将默认的Ubuntu系统改成桌面版
    python之demo2----改编自python官方提供的turtle_yinyang.py画阴阳的demo
    python之demo1----改编自turtle.py文件中的demo
  • 原文地址:https://www.cnblogs.com/minun/p/11250791.html
Copyright © 2020-2023  润新知