Escape(反思与总结)
题目描述:
BH is in a maze,the maze is a matrix,he wants to escape!
Input:
The input consists of multiple test cases.
For each case,the first line contains 2 integers N,M( 1 <= N, M <= 100 ).
Each of the following N lines contain M characters. Each character means a cell of the map.
Here is the definition for chracter.
For a character in the map:
'S':BH's start place,only one in the map.
'E':the goal cell,only one in the map.
'.':empty cell.
'#':obstacle cell.
'A':accelerated rune.
BH can move to 4 directions(up,down,left,right) in each step.It cost 2 seconds without accelerated rune.When he get accelerated rune,moving one step only cost 1 second.The buff lasts 5 seconds,and the time doesn't stack when you get another accelerated rune.(that means in anytime BH gets an accelerated rune,the buff time become 5 seconds).
Output:
The minimum time BH get to the goal cell,if he can't,print "Please help BH!".
理解:
总体来说,这个游戏是要玩最短路hhh,但是要判断有无加速向,最开始只想着用二维数组来记录从起点到每一个点的最短路径(距离),然后用queue正常做,只不过在结构体中多用一个buff元素来判断是否有吃到加速,然后每一次 if(que.front().buff > 0) temp.buff = que.front().buff-1;但由于经过同一点时,可能会有不同的路径,并且也可能有更短的出现,在标记buff和最短路难以权衡。
于是在某大大怪大牛的提醒下,在结构体中用step来记录最短路(这样就可以更新相同点的最短路),然后就是本题最核心也最有意思的地方了,用优先队列处理数据~。。由于同一点都可能有不同的路径,而不同的路径就会有可能有的路径有buff,有的没有(也可以理解为,同一个点先去捡一个buff,大致捡了buff的路径通常会最短?这个有待我思考。)于是用一个三维vis来记录同一个点出现的不同能量值,如果没标记过,就要标记起来并且压入的队列。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = ;
const int INF = 0x3f3f3f3f;
bool vis[maxn][maxn][];
int way[][] = { {,}, {,-}, {,}, {-,} };
int mins;
struct node{
int x,y,step,buff;
friend bool operator < (const node a, const node b)
{
if(a.step == b.step) return a.buff < b.buff;
return a.step > b.step;
}
};
priority_queue<node> que;
int n, m, sx, sy, ex, ey;
char a[maxn][maxn];
void bfs(){
node temp, next, first;
vis[sx][sy][] = true;
first.x = sx, first.y = sy, first.step = , first.buff = ;
que.push(first);
while(!que.empty()){
temp = que.top();
que.pop();
if(temp.x == ex && temp.y == ey){
mins = min(mins, temp.step);
break;
}
else
{
for(int i = ; i < ; i++)
{
int dx = temp.x+way[i][];
int dy = temp.y+way[i][];
if(dx< || dx>=n || dy< || dy>=m || a[dx][dy] == '#') continue;
if(temp.buff > ){
next.buff = temp.buff - ;
next.step = temp.step + ;
}else{
next.buff = ;
next.step = temp.step + ;
}
if(a[dx][dy] == 'A')
next.buff = ;
if(vis[dx][dy][next.buff])
continue;
vis[dx][dy][next.buff] = true;
next.x = dx, next.y = dy;
que.push(next);
}
}
}
return ;
} int main()
{
while(cin >> n >> m){
mins = INF;
memset(vis, false, sizeof(vis));
memset(a, , sizeof(a));
while(!que.empty()) que.pop();
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
cin >> a[i][j];
for(int i = ; i < n; i++)
for(int j = ; j < m; j++){
if(a[i][j] == 'S')
sx = i, sy = j;
else if(a[i][j] == 'E')
ex = i, ey = j;
}
bfs();
if(mins == INF)
cout << "Please help BH!" << "\r\n";
else
cout << mins << "\r\n";
}
return ;
}
Escape(反思与总结)的更多相关文章
- [考试反思]1029csp-s模拟测试93:殇逝
并不是把它消成上三角矩阵 停止! 思考, 回顾. 疑惑? 遗忘… 一直只是在匆忙的赶进度,实际上的确是一点也不扎实. T1,裸的偏序,想了一个多小时什么也没想到,只打了$O(n^2)$ 难道之前学的就 ...
- Noip2016 总结&反思
一直在期盼的联赛,真正来临时,却远不像我想象的样子. 有些事,真的不敢再想. 算法可以离线,时光却不能倒流.dfs可以回溯,现实却没有如果. 有些事,注定只能成为缺憾,抱恨终生. 不得不说今年Noip ...
- 关于2016.12.12——T1的反思:凸包的意义与应用
2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ...
- ACM: Gym 101047E Escape from Ayutthaya - BFS
Gym 101047E Escape from Ayutthaya Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I6 ...
- 简单明了区分escape、encodeURI和encodeURIComponent
一.前言 讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它们不是同一类 简单来说,escape是对字符串(string)进行编码(而另外两种 ...
- c#模拟js escape方法
public static string Escape(string s) { StringBuilder sb = new StringBuilder(); byte[] ba = System.T ...
- 【BZOJ-1340】Escape逃跑问题 最小割
1340: [Baltic2007]Escape逃跑问题 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 264 Solved: 121[Submit] ...
- LYDSY热身赛 escape
Description 给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上矩形的行 ...
- 上个项目的一些反思 I
最近一直在反思之前的项目,发现了很多问题.比如数据安全... 虽然项目需求是只展示最新的数据,所以几乎没用什么本地存储.除了通讯录和用户的Token. 用户通讯录另表,今天反思下用户的Token的存储 ...
随机推荐
- HTML5 App商业开发实战教程 基于WeX5可视化开发平台
- Ogre3d 1.7.x 的 RTShaderSystem的一个BUG
来源:http://www.ogre3d.org/forums/viewtopic.php?f=2&t=63644 表现:使用dx的shader可能会造成程序崩溃. 在文件OgreShader ...
- 浅谈JS异步(asychrouous)
一.概念 (1)asychronous 异步 是JS这种单线程语言解决多任务的一种方法,将耗时的任务(io)设定为异步工作,先交给浏览器负责相关功能的线程来实现耗时的部分工作,按顺序放入任务队列中,等 ...
- docker 简单使用
1.docker 命令 docker start nginx https://www.w3cschool.cn/docker/windows-docker-install.html // docker ...
- try catch finally的理解
定义以及用法: try/catch/finally 语句用于处理代码中可能出现的错误信息. 错误可能是语法错误,通常是程序员造成的编码错误或错别字.也可能是拼写错误或语言中缺少的功能(可能由于浏览器差 ...
- Docker(二):理解容器编排工具Kubernetes内部工作原理
一.Kubernetes是什么 要说到Docker就不得不说说Kubernetes.当Docker容器在微服务的环境下数量一多,那么统一的,自动化的管理自然少不了.而Kubernetes就是一个这样的 ...
- VS下解决_CRT_SECURE_NO_WARNINGS 警告
1.带有警告的文件加 #define _CRT_SECURE_NO_WARNINGS 2.右击工程 - 属性 - 配置属性 - C/C++ - 命令行 命令行增加 /D _CRT_SECURE_NO ...
- 【原创】为什么Mongodb索引用B树,而Mysql用B+树?
引言 好久没写文章了,今天回来重操旧业.毕竟现在对后端开发的要求越来越高,大家要做好各种准备. 因此,大家有可能遇到如下问题 为什么Mysql中Innodb的索引结构采取B+树? 回答这个问题时,给自 ...
- SLF4j 居然不是编译时绑定?日志又该如何正确的分文件输出?——原理与总结篇
各位新年快乐,过了个新年,休(hua)息(shui)了三周,不过我又回来更新了,经过前面四篇想必小伙伴已经了解日志的使用以及最佳实践了,这个系列的文章也差不多要结束了,今天我们来总结一下. 概览 这篇 ...
- Asp.Net Api+Swagger控制器注释
Swagger注释不显示,只需要进入Startup.cs 找到: c.IncludeXmlComments(Path.Combine(AppDomain.CurrentDomain.BaseDirec ...