2020牛客寒假算法基础集训营5 街机争霸
https://ac.nowcoder.com/acm/contest/3006/G
题意
牛牛和牛能进入了一个迷宫,这个迷宫里除了墙壁的阻拦,还会有僵尸的阻拦。情况十分复杂,牛能为了更快的追逐牛牛,迅速放出了大招,让牛牛原地眩晕,而眩晕的解药,也只有牛能自己拥有。
这一个迷宫可以简化为一个 n 行 m 列的矩阵,其中有一些僵尸,这些僵尸会在一个 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\n",p.x,p.y);
if(p.x==ex&&p.y==ey)
{
printf("%d\n",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\n");
}