• 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
    ");
    }
  • 相关阅读:
    Gym 101194L / UVALive 7908
    POJ 2259
    POJ 2559
    Gym 101194E / UVALive 7901
    Gym 101194D / UVALive 7900
    一种整数集上二分的正确写法
    日常训练记录
    Gym 101194C / UVALive 7899
    Gym 101194A / UVALive 7897
    HDU 5542
  • 原文地址:https://www.cnblogs.com/VividBinGo/p/12335958.html
Copyright © 2020-2023  润新知