2018年四校联合周赛-第三场(新手场) D 盖伦快跑
最近WS因差1分钟没能AK而深受打击,自(bi)暴(guan)自(xiu)弃(lian),沉迷英雄(shua)联盟(ti)无法自拔,有天WS突发奇想,准备开发一款英雄联盟版的迷宫游戏,游戏规则如下:
英雄盖伦出生在迷宫的某处,盖伦可往前后左右四个方向走动,每走一步用时为1(也可停止不动),盖伦带有技能闪现,使用闪现可以穿过1个厚度的墙(耗时为1,穿完墙落地开始闪现进入CD),闪现技能CD为p,迷宫中随机分布0-3个蓝爸爸,经过蓝爸爸时可以选择打或者不打,击杀蓝爸爸消耗1单位时间并可获得蓝buff(蓝爸爸不会复活),蓝buff持续时间为q,buff持续时间内使用闪现技能CD减半(向下取整,如果我击杀蓝buff时候技能还处于cd状态cd不会减半),多个蓝buff时间可叠加。请写出一个程序求出盖伦走出迷宫所需的最小时间。
ps:buff剩一秒时穿墙后闪现CD按原CD计算。
输入包含多个测试下样例,每个样例的第一行包含4个整数m,n,p,q。分别表示迷宫的长,宽,闪现CD,每个蓝buff持续时间,1<=m,n<=20,1<=p,q<=10。接下来的m行为迷宫分布,#表示墙,.表示路,@表示蓝爸爸,S表示英雄出生点,E表示迷宫出口。
(测试数据保证至少有一条路可以通向出口)
输出一个数字表示盖伦走出迷宫所需的最小时间
1 10 1 5 S.#..#..#E1 10 2 5 S.#..#..#E1 10 2 5 S@#..#..#E
6 8 7
思路:主要是不好保存状态,可以用五维数组,分别保存坐标,cd,buff时间,以及记录哪些蓝buff是打过的,最不好保存的是哪些蓝buff打过,由于蓝buff只有打过和没打过两种状态,可以考虑用二进制来保存,每个二进制位的1或0表示该蓝buff是否打过。注意一种特殊情况:S.#@#.#.#.#.#E,我到达蓝buff时,可以先等待几秒,等到CD快没了的时候再打蓝buff。
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;const int maxn = 25;
char mat[maxn][maxn];
bool vis[25][25][12][12][8];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
int m,n,p,q;struct node
{int x,y,cd,buff,mark,time;
}st,ed;int check(node a)
{if (a.x < 0 || a.x >= n || a.y < 0 || a.y >= m) return 0;return 1;
}int bfs()
{memset(vis,false,sizeof(vis));queue <node> Q; st.cd = st.buff = st.mark = st.time = 0;Q.push(st);vis[st.x][st.y][st.cd][st.buff][st.mark] = true;node now,next;while (!Q.empty()){now = Q.front();Q.pop();if (now.x == ed.x && now.y == ed.y) return now.time;next = now;if (mat[now.x][now.y] >= 0 && mat[now.x][now.y] <= 2)//判断是否为蓝buff {if ((now.mark & (1 << mat[now.x][now.y])) == 0)//判断该蓝buff是否打过 {next.mark += 1 << mat[now.x][now.y];//将该蓝buff标记为打过 next.time++;next.cd = next.cd > 0 ? next.cd - 1 : 0;next.buff = next.buff > 0 ? next.buff - 1 : 0;next.buff += q;if (!vis[next.x][next.y][next.cd][next.buff][next.mark]){Q.push(next);vis[next.x][next.y][next.cd][next.buff][next.mark] = true;}}}next = now;if (now.cd > 0 || now.buff > 0)//前面提到的原地等待CD的情况,这里还考虑了 { //原地消耗蓝buff时间的情况(暂时不知道是否有用) next.cd = next.cd > 0 ? next.cd - 1 : 0;next.buff = next.buff > 0 ? next.buff - 1 : 0;next.time++;if (!vis[next.x][next.y][next.cd][next.buff][next.mark]){Q.push(next);vis[next.x][next.y][next.cd][next.buff][next.mark] = true;}}for (int i = 0; i < 4; i++){next = now;next.x += dir[i][0];next.y += dir[i][1];if (!check(next)) continue;if (mat[next.x][next.y] == '#')//使用闪现穿墙 {if (next.cd > 0) continue;next.x += dir[i][0];next.y += dir[i][1];if (!check(next) || mat[next.x][next.y] == '#') continue;if (next.buff > 1) next.cd = p/2;//有buff则CD时间减半 else next.cd = p;next.buff = next.buff > 0 ? next.buff - 1 : 0;next.time++;if (!vis[next.x][next.y][next.cd][next.buff][next.mark]){Q.push(next);vis[next.x][next.y][next.cd][next.buff][next.mark] = true;} }else{next.cd = next.cd > 0 ? next.cd - 1 : 0;next.buff = next.buff > 0 ? next.buff - 1 : 0;next.time++;if (!vis[next.x][next.y][next.cd][next.buff][next.mark]){Q.push(next);vis[next.x][next.y][next.cd][next.buff][next.mark] = true;}}}}return 0;
}int main()
{while (scanf("%d%d%d%d",&n,&m,&p,&q) != EOF){for (int i = 0; i < n; i++)scanf("%s",mat[i]);int id = 0;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){if (mat[i][j] == 'S'){st.x = i;st.y = j;}if (mat[i][j] == 'E'){ed.x = i;ed.y = j;}if (mat[i][j] == '@'){mat[i][j] = id++;//为每个蓝buff编号 }}}printf("%d\n",bfs());} return 0;
}
2018年四校联合周赛-第三场(新手场) D 盖伦快跑相关推荐
- 2018六校联合周赛上学期第一场-我来爆零啦 寻找中位数 kth
题目链接 寻找中位数 TimeLimit:1000MS MemoryLimit:128MB 64-bit integer IO format:%lld Problem Description 这题温 ...
- 牛客网暑期ACM多校训练营(第三场)
牛客网暑期ACM多校训练营(第三场) A. PACM Team 01背包,输出方案,用bool存每种状态下用的哪一个物品,卡内存.官方题解上,说用char或者short就行了.还有一种做法是把用的物品 ...
- 2019牛客暑期多校训练营(第三场)H.Magic Line
2019牛客暑期多校训练营(第三场)H.Magic Line 题目链接 题目描述 There are always some problems that seem simple but is diff ...
- 2020牛客暑期多校训练营(第三场)A.Clam and Fish
2020牛客暑期多校训练营(第三场)A.Clam and Fish 题目链接 题目描述 There is a fishing game as following: The game contains ...
- 2018六校联合校赛-1st-买手机
题目描述: 阿Jun是个小屏手机爱好者,他拒绝一切带有plus和note字眼的手机,而他一直使用的是一部美国苹果公司出品的iPhoneSE. 可惜的是,有一次阿Jun在洗手间洗手,不小心手一抖,手机掉 ...
- 职场小说:《米亚快跑》PDF版下载
这是一部奇特有趣的女性职场小说,不陷入目前市场上任何一部职场小说的窠臼,不大惊小怪地描述外企优越感,不涉及耸人听闻的职场阴谋,不触碰自说自话的情感纠葛-- 米娅,一个有点二百五,有点唠叨的姑娘,毕业于 ...
- HDU 2019 Multi-University Training Contest 1 杭电2019多校联合训练赛 第一场 1001 Blank (6578)
HDU 2019 Multi-University Training Contest 1 杭电2019暑期多校集训第一场 1001 Blank (6578) Problem Description T ...
- 暑假N天乐【比赛篇】 —— 2019牛客暑期多校训练营(第三场)
这场相对来说友好一点,本来前几天就补差不多了,然后忘记发了... 以下题解包括:\(A \ \ \ B \ \ \ F \ \ \ G \ \ \ H \ \ \ J\) \(D\) 题队友补了,我也 ...
- 2013多校训练赛第三场 总结
HDU 4621~4631 今天的多校好变态,是IOI冠军出的题,把我们虐的半死了. 简单讲一下今天的情况,今天就只做了两道水题,算是签了个到,然后就卡1011(HDU 4631)一个下午了.其实感觉 ...
最新文章
- 谷歌最新的PlaNet对强化学习以及迁移学习的意义及启发
- 泛型排序器TComparer
- 简单的对象监听器 观察者设计模式
- 秀操作:函数宏的三种封装方式
- 最新BAT大厂面试者整理的Android面试题目模板,成功入职字节跳动
- argb可以和rgb同步吗_乔思伯推出CPU及M.2散热器:均支持ARGB神光同步
- Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(13/E) - FXSAVE/FXRSTOR指令
- LaTeX tikz初探——利用emoji画GPS卫星3D分布图(3)
- 架构实战项目心得(一):技术和工具
- MySQL游标循环取出空值的BUG
- 用Python网络爬虫来抓取网易云音乐歌词
- linux bzip2 命令,Linux bzip2 命令的使用
- 如何巧妙将流量转化为销量?
- Docker:Unable to find image ‘mysql:latest‘ locally
- 随机采样和分布式光线追踪
- HCIA/HCIP使用eNSP模拟VRRP配置实验(接入层 汇聚层 核心层 VLAN OSPF VRRP STP DHCP的综合应用)
- java卡牌游戏详解
- java sql语句模糊查询
- 判断英伟达显卡计算力及是否支持FP16和INT8
- python中的set是什么意思_python中的set是什么