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
");
}
原文地址:https://www.cnblogs.com/VividBinGo/p/12335958.html