• 2020牛客寒假算法基础集训营5 街机争霸


    https://ac.nowcoder.com/acm/contest/3006/G

    题意

      牛牛和牛能进入了一个迷宫,这个迷宫里除了墙壁的阻拦,还会有僵尸的阻拦。情况十分复杂,牛能为了更快的追逐牛牛,迅速放出了大招,让牛牛原地眩晕,而眩晕的解药,也只有牛能自己拥有。

      这一个迷宫可以简化为一个 行 列的矩阵,其中有一些僵尸,这些僵尸会在一个 1 ∗ k 的矩形中来回游走。他不会攻击眩晕状态下的人,只会攻击和他抢地盘的人。这名队员每次移动需要一个单位时间,而且他不能穿墙,不能和僵尸处于同一位置,在追到另一名队员之前也不能停下来。

      在这一场追逐战中,要么牛能追逐成功,取得胜利,要么被僵尸击败,牛牛胜利。那谁会是最终的王者呢?

    题解

      简单bfs的基础上加一维时间。僵尸的来回移动以(2 * k - 2)为一个周期。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
      int x,y,t;
    };
    int go[4][2]={-1,0,1,0,0,-1,0,1},zombie[510][510][25],vis[510][510];
    char g[510][510];
    int n,m,p,k,sx,sy,ex,ey;
    void bfs();
    int check(int x,int y,int t);
    int main()
    {
      int i,j,x,y,dir;
      char op[10];
      scanf("%d%d%d%d",&n,&m,&p,&k);
      for(i=1;i<=n;i++)
      {
        scanf("%s",g[i]+1);
        for(j=1;j<=m;j++)
        {
          if(g[i][j]=='L')  sx=i,sy=j;
          if(g[i][j]=='A')  ex=i,ey=j;
        }
      }
      
      for(i=0;i<p;i++)
      {
        scanf("%d%d%s",&x,&y,op);
        zombie[x][y][0]=1;
        if(op[0]=='U')  dir=0;
        else if (op[0]=='D') dir=1;
        else if (op[0]=='L') dir=2;
        else dir=3;
    
        for(j=1;j<k;j++)
        {
          x+=go[dir][0];
          y+=go[dir][1];
          zombie[x][y][j]=1;
          zombie[x][y][j+2*k-4-(j-1)*2]=1;
        }
      }
      bfs();
      system("pause");
      return 0;
    }
    int check(int x,int y,int t)
    {
      if(vis[x][y]||g[x][y]=='&'||zombie[x][y][t%(2*k-2)]||x<1||x>n||y<1||y>m) return 1;
      return 0;
    }
    void bfs()
    {
      queue<node> que;
      node p;
      int i,x,y;
      vis[sx][sy]=1;
      que.push(node{sx,sy,0});
      while(!que.empty())
      {
        p=que.front();
        que.pop();
        //printf("x == %d y == %d
    ",p.x,p.y);
        if(p.x==ex&&p.y==ey)
        {
          printf("%d
    ",p.t);
          return ;
        }
        for(i=0;i<4;i++)
        {
          x=p.x+go[i][0];
          y=p.y+go[i][1];
          if(check(x,y,p.t+1)) continue;
          vis[x][y]=1;
          que.push(node{x,y,p.t+1});
        }
      }
      printf("Oh no
    ");
    }
  • 相关阅读:
    LInux 解压缩文件
    关于启明星系统移除apppath配置,让系统自动获取路径来设置cookie的解决方法
    Repository 设计模式介绍
    启明星桌面天气系统和抽奖系统源代码
    关于web.config增加禁止匿名访问而导致pdf失效的问题
    C#取硬盘、CPU、主板、网卡的序号 ManagementObjectSearcher (WMI)
    如何在windows2008/2012上安装启明星系统。
    连接MSSQL2008 Express
    启明星系统加密方法代码
    MSSQL2008 全文索引的创建
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/12335958.html
Copyright © 2020-2023  润新知