题意:给你一个迷宫,迷宫有开始节点和结束节点,问你从开始走到结束的最小时间,其中,#代表这个点有毒气,身上必须带着氧气瓶才行,B代表每次进入这个点可以带一个氧气瓶,最多身上带五个,P代表进入这个点加速,不耗费时间

解题思路:就是bfs+优先队列,就是氧气瓶的地方麻烦点,我们只需要对于每个点,用一个多余的状态标记进入这个点身上氧气瓶的数量就可以了

代码:

#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,step,cnt; node(int _x=,int _y=,int _step=,int _cnt=):x(_x),y(_y),step(_step),cnt(_cnt){}
friend bool operator<(node a,node b)
{
return a.step>b.step;
}
}tmp,now;
char s[][];
int n,m,sx,sy;
int next1[][]={{-,},{,},{,},{,-}};
int visit[][][];
int bfs(int x,int y)
{
priority_queue<node>que;
que.push(node(x,y,,));
while(!que.empty())
{
now=que.top();que.pop();
if(s[now.x][now.y]=='T')
return now.step;
for(int i=;i<;i++)
{ tmp.x=now.x+next1[i][];tmp.y=now.y+next1[i][];
if(tmp.x<||tmp.x>n||tmp.y<||tmp.y>m)
continue;
if(s[tmp.x][tmp.y]=='B')
{
tmp.cnt=min(,now.cnt+);tmp.step=now.step+;
if(!visit[tmp.x][tmp.y][tmp.cnt])
{
visit[tmp.x][tmp.y][tmp.cnt]=;
que.push(tmp);
}
}
else if(s[tmp.x][tmp.y]=='P')
{
tmp.cnt=now.cnt;tmp.step=now.step;
if(!visit[tmp.x][tmp.y][tmp.cnt])
{
visit[tmp.x][tmp.y][tmp.cnt]=;
que.push(tmp);
}
}
else if(s[tmp.x][tmp.y]=='#')
{
tmp.cnt=now.cnt-;tmp.step=now.step+;
if(tmp.cnt<)
continue;
if(!visit[tmp.x][tmp.y][tmp.cnt])
{
visit[tmp.x][tmp.y][tmp.cnt]=;
que.push(tmp);
}
}
else
{
tmp.cnt=now.cnt;tmp.step=now.step+;
if(!visit[tmp.x][tmp.y][tmp.cnt])
{
visit[tmp.x][tmp.y][tmp.cnt]=;
que.push(tmp);
}
}
} }
return -;
}
int main()
{
while(cin>>n>>m&&n&&m)
{
memset(visit,,sizeof(visit));
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
cin>>s[i][j];if(s[i][j]=='S'){sx=i;sy=j;}
}
int ans=bfs(sx,sy);
cout<<ans<<endl;
}
}

最新文章

  1. bzoj3048+3049+3050
  2. 第3月第13天 cpp模版 Iterator模式 proactor
  3. photoshop, 钢笔上色
  4. 高吞吐量的分布式发布订阅消息系统Kafka--安装及测试
  5. mysql并发insert deadlock分析以及解决,无delete/update/for update
  6. 用github pages展示你的静态网页,多项目支持
  7. 集成“支付宝” -b
  8. (十一)学习CSS之float属性
  9. deb包处理
  10. [TYVJ] P1004 滑雪
  11. 历时一年,我的著作《第一行代码——Android》已出版!
  12. Select与SelectMany的区别
  13. 深入理解 JavaScript 异步系列(5)—— async await
  14. Java历程-初学篇 Day05选择结构(2)
  15. 使用Quartz 2D擦除图片
  16. os.getcwd()、sys.path[0]、sys.argv[0]和__file__的区别,终于弄清楚了
  17. shell 参数列表的获取&amp;shell使用的一些总结
  18. 科学计算工具Numpy
  19. CSS:margin和padding之谜
  20. 前端框架Angular、react、vue在github上的数据统计-2018-05

热门文章

  1. 内联汇编获取Kernaer32基址.
  2. kubernetes系列12—二个特色的存储卷configmap和secret
  3. java jdk 8反编译工具JD-GUI、procyon-decompiler、luyten、crf下载使用简介
  4. Springboot 系列(四)Spring Boot 日志框架
  5. oracle学习笔记(一) oracle 体系结构简单介绍以及创建表空间和用户
  6. 基于Html5 Plus + Vue + Mui 移动App 开发(二)
  7. 巧用Handler获取View控件信息
  8. 【工作分解法】IT人,你的工作“轻松”么?
  9. name &#39;reload&#39; is not defined解决方法
  10. WPF软件开发系统之二——水环境检测Surface触摸屏软件开发