2020牛客寒假算法基础集训营5 G街机争霸
题目描述
哎,又是银首,要是你这个签到题少WA一发就金了
牛牛战队的队员打完比赛以后又到了日常甩锅的时间。他们心情悲伤,吃完晚饭以后,大家相约到一个街机厅去solo。牛牛和牛能进入了一个迷宫,这个迷宫里除了墙壁的阻拦,还会有僵尸的阻拦。情况十分复杂,牛能为了更快的追逐牛牛,迅速放出了大招,让牛牛原地眩晕,而眩晕的解药,也只有牛能自己拥有。
这一个迷宫可以简化为一个$n$行$m$列的矩阵,其中有一些僵尸,这些僵尸会在一个$1*k$的矩形中来回游走。他不会攻击眩晕状态下的人,只会攻击和他抢地盘的人。这名队员每次移动需要一个单位时间,而且他不能穿墙,不能和僵尸处于同一位置,在追到另一名队员之前也不能停下来。
在这一场追逐战中,要么牛能追逐成功,取得胜利,要么被僵尸击败,牛牛胜利。那谁会是最终的王者呢?
输入描述:
输入数据有很多行。第一行输入4个整数$n,m,p,k(3\leq n,m\leq 500,0\leq p\leq 50,2\leq k\leq 10)$,分别表示迷宫的行、列,僵尸的数量,僵尸来回走动的长度。
第2行到第$n+1$行输入一个矩阵,每行输入一个字符串,第$i$个字符串的第$j$个字符表示矩阵中第$i$行$j$列的状态,如果字符是#表示是可以走的路,如果是&表示是障碍物,A是被眩晕队员的位置,L是追赶者的位置。
第$n+2$行到第$n+p+1$行每行输入两个整数$x,y$和一个字符串,第$i$行的数据表示第$i$个僵尸当前时间会从第$x$行$y$列出发,沿着固有的方向前进$k$个单位时间后折返,再走回它之前的位置,再折返,依照这种方法循环下去。第三个字符串表示僵尸初始行进的方向,UP表示向上走,LEFT表示向左走,DOWN表示向下走,RIGHT表示向右走。数据保证在$k$个长度内僵尸不会碰到边界或者墙壁。
输出描述:
如果牛能可以追上牛牛,输出一个整数,表示最短追上的时间。否则输出一行Oh no。
输入
4 4 1 2
L#&A
##&#
#&##
####
3 3 DOWN
输出
Oh no
说明
初始状态
L#&A
##&#
#&*#
####
一单位时间后
##&A
L#&#
#&##
##*#
二单位时间后
##&A
##&#
L&*#
####
三单位时间后
##&A
##&#
#&##
L#*#
四单位时间后
##&A
##&#
#&*#
#L##
牛能如果再向左走的话就会跟僵尸碰个正着,而且不论牛能怎么往回走,在(4,3)总能遇见僵尸,所以他失败了。
传送门:
https://ac.nowcoder.com/acm/contest/3006/G
思路:
不会搜索的我,只能看题解之后琢磨了。
首先这道题如果没有僵尸的话,就是一道基础的BFS题,但出题人丢给你$p$个僵尸,怎么办呢?
仔细看题中有两个限制条件,$p$个僵尸的步伐一致并且在$1*k$的矩形内来回游走。
当僵尸走的次数为$1,2k+1,3k+1...nk+1$时,僵尸都处在同一位置,也就是说僵尸以$2k$为周期来回走。
所以只要在加一维来记录步数的变化。具体看代码。
代码:
#include<bits/stdc++.h> using namespace std; int n, m, p, k; int mod; int ax, ay; int bx, by; char s[][]; bool no[][][]; bool vis[][]; int d[][] = {, , , -, -, , , };
struct node
{
int x;
int y;
int d;
}; queue<node>q; int ans;
int bfs(int x, int y)
{
node tmp;
tmp.x = x, tmp.y = y, tmp.d = ;
q.push(tmp);
vis[x][y] = ; while(q.size())
{
node t = q.front();
q.pop();
if(t.x == ax && t.y == ay)
return ans = t.d; for(int i = ; i < ; i++)
{
int xx = t.x + d[i][];
int yy = t.y + d[i][]; if(xx < || xx > n || yy < || yy > m || no[xx][yy][(t.d + ) % mod] || s[xx][yy] == '&' || vis[xx][yy])
continue;
vis[xx][yy] = ;
tmp.x = xx;
tmp.y = yy;
tmp.d = t.d + ;
q.push(tmp);
}
}
return -;
}
int main() {
scanf("%d%d%d%d", &n, &m, &p, &k);
mod = * k - ; for(int i = ; i <= n; i++)
{
scanf("%s", s[i] + );
for(int j = ; j <= m; j++)
{
if(s[i][j] == 'A')
{
ax = i;
ay = j;
}
else if(s[i][j] == 'L')
{
bx = i;
by = j;
}
}
} for(int i = ; i <= p; i++)
{
int x, y;
char op[];
scanf("%d %d %s", &x, &y, op);
if(op[] == 'R')
{
for(int j = ; j < k; j++)
{
no[x][y + j][j] = ;
no[x][y + j][((k - ) * - j) % mod] = ;
}
}
else if(op[] == 'L')
{
for(int j = ; j < k; j++)
{
no[x][y - j][j] = ;
no[x][y - j][((k - ) * - j) % mod] = ;
}
}
else if(op[] == 'U')
{
for(int j = ; j < k; j++)
{
no[x - j][y][j] = ;
no[x - j][y][((k - ) * - j) % mod] = ;
}
}
else if(op[] == 'D')
{
for(int j = ; j < k; j++)
{
no[x + j][y][j] = ;
no[x + j][y][((k - ) * - j) % mod] = ;
}
}
}
if(bfs(bx, by) == -)
{
printf("Oh no\n");
}
else
{
printf("%d\n", ans );
}
}
2020牛客寒假算法基础集训营5 G街机争霸的更多相关文章
- 2020牛客寒假算法基础集训营5 G.街机争霸 (bfs)
https://ac.nowcoder.com/acm/problem/201961 预处理出僵尸走的路径,僵尸走的周期长度应该为2k-2,在普通的bfs基础上加上一维表示时间,从当前位置x,y和和时 ...
- 2020牛客寒假算法基础集训营4 G音乐鉴赏
题目描述 作为“音乐鉴赏”课的任课老师,你的课程作为刷学分好课一直受到广泛欢迎.但这一学期,学校制定了新的标准,你的课的优秀率(分数超过90分的人数)被限制在10%以下! 为了应对这个调整,你要求所有 ...
- 2020牛客寒假算法基础集训营3 G.牛牛的Link Power II (树状数组维护前缀和)
https://ac.nowcoder.com/acm/contest/3004/G 发现每个“1”对于它本身位置产生的影响贡献为0,对前面的“1”有产生贡献,对后面的"1"也产生 ...
- 2020牛客寒假算法基础集训营3 - G. 牛牛的Link Power II(线段树)
题目链接:牛牛的Link Power II 题意:给你一个只含$0$和$1$的串,定义串的$Link$值为串中两个的$1$之间的距离的和,$(u,v)$和$(v,u)$被看认为是同一对,有$m$次操作 ...
- 2020牛客寒假算法基础集训营2 J题可以回顾回顾
2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...
- 2020牛客寒假算法基础集训营1 J题可以回顾回顾
2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...
- 2020牛客寒假算法基础集训营4-F树上博弈
链接:https://ac.nowcoder.com/acm/contest/3005/F来源:牛客网 题目描述 现有一个 n 个点,n-1条边组成的树,其中 1 号点为根节点. 牛牛和牛妹在树上玩游 ...
- 2020牛客寒假算法基础集训营4-I 匹配星星【贪心】
链接:https://ac.nowcoder.com/acm/contest/3005/I来源:牛客网 示例1 输入 复制 2 1 1 0 2 2 1 2 1 1 0 2 2 1 输出 复制 1 1 ...
- 2020牛客寒假算法基础集训营1 F-maki和tree
链接:https://ac.nowcoder.com/acm/contest/3002/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
随机推荐
- 主机ping虚拟机失败。虚拟机ping主机,可以ping通。
原文:https://blog.csdn.net/ww1473345713/article/details/51490525 今天打开虚拟机,然后用Xshell远程连接,发现连接不上.按照以下顺序检查 ...
- http https 干货
HTTPS原理 在谈HTTPS原理之前,首先了解一下Http和Https的区别. Http(全称:Hyper Text Transfer Protocol),一般称为超文本传输协议,也是互联 ...
- Netty 中队列的使用
任务队列中的Task有3种典型使用场景 用户程序自定义的普通任务 此前代码: 参考https://www.cnblogs.com/ronnieyuan/p/12016712.html NettySer ...
- Asp.net禁用site.Mobile.Master
RT,在asp.net新的项目中遇到的一个问题.项目使用了Boostrap后网页打开是正常的,但是换成移动端打开这个网页的时候就奇怪了.很多样式不见了.原来是自动切换到了site.Mobile.Mas ...
- Golang的基础数据类型-字符串型
Golang的基础数据类型-字符串型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符型概述 上一篇博客学习了使用单引号括起来的单个字符就是字符类型,在Golang中有两种表 ...
- doc转docx
# -*- coding: utf-8-*- import win32com from win32com.client import Dispatch w = win32com.client.Disp ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 命名空间
假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等. 同样的情况也出现在 C++ 应用程 ...
- spring boot 开发环境搭建(Eclipse)
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- .NET via C#笔记5——基元类型,引用类型和值类型
5 基元类型,引用类型和值类型 5.3 值类型的装箱和拆箱 将值类型转化为引用类型需要进行装箱(boxing) 赋值,传参等操作,如果从值类型转为引用类型,都会进行装箱 装箱的代价比较大 申请一块堆内 ...
- 51nod 1006:最长公共子序列Lcs
1006 最长公共子序列Lcs 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...