题意:

'S' : 起点

'T' : 终点

'#' : 毒气室

'B' :氧气

'P':不消耗步数

每次经过毒气室需要一瓶氧气,氧气可以重复获得,但只能带五瓶氧气,问最少步数

solution:

HINT:多维状态判重,多一维携带氧气瓶数量

没带氧气瓶的时候不能走毒气室#

携带超过5个跳过氧气B

相似题目:UVA816 Abbott's Revenge这题多一维方向

  1 #include<bits/stdc++.h>
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<algorithm>
  5 #include<vector>
  6 #include<queue>
  7 #include<cstring>
  8 #define fi first
  9 #define se second
 10 #define mp make_pair
 11 #define pb push_back
 12 #define pw(x) (1ll << (x))
 13 #define sz(x) ((int)(x).size())
 14 #define all(x) (x).begin(),(x).end()
 15 #define rep(i,l,r) for(int i=(l);i<(r);++i)
 16 #define per(i,l,r) for(int i=(r)-1;i>=(l);--i)
 17 #define maxn 500005
 18 #define eps 1e-9
 19 #define PIE acos(-1)
 20 #define dd(x) cout << #x << " = " << (x) << ", "
 21 #define de(x) cout << #x << " = " << (x) << "\n"
 22 #define endl "\n"
 23 #define INF 0x3f3f3f3f
 24 using namespace std;
 25 typedef double db;
 26 typedef long long LL;
 27 typedef vector<int> vi;
 28 typedef pair<int, int> pii;
 29 //----------------------
 30 int n,m;
 31 char pic[105][105];
 32 bool vis[105][105][6];
 33 const int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
 34 struct Node{
 35     int x;
 36     int y;
 37     int d=0;
 38     int cnt=0;
 39     bool operator<(const Node& a)const{
 40         return d>a.d;
 41     }
 42 }start,u,v;
 43 int cnt;
 44 bool check(Node v)
 45 {
 46     return v.x>=0&&v.x<n&&v.y>=0&&v.y<m;
 47 }
 48 int bfs(int x,int y)//把#当路障,找氧气瓶
 49 {
 50     memset(vis,0,sizeof(vis));
 51     priority_queue<Node>q;
 52     vis[x][y][0]=1;
 53     start.x=x;start.y=y;start.d=0;start.cnt=0;
 54     q.push(start);
 55     while(!q.empty())
 56     {
 57         u=q.top();q.pop();
 58         if(pic[u.x][u.y]=='T'){return u.d;}
 59         rep(i,0,4){
 60             v=u;
 61             v.x+=dir[i][0];
 62             v.y+=dir[i][1];
 63             if(!check(v))continue;
 64             if(pic[v.x][v.y]=='#'){
 65                 if(v.cnt>=1)v.cnt--,v.d++;
 66                 else continue;
 67             }
 68             else if(pic[v.x][v.y]=='B'){
 69                 if(v.cnt>=5)continue;
 70                 else v.cnt++;
 71             }
 72             else if(pic[v.x][v.y]=='P')v.d--;
 73             v.d++;
 74             if(vis[v.x][v.y][v.cnt])continue;
 75             vis[v.x][v.y][v.cnt]=1;
 76 //             dd(v.x+1);dd(v.y+1);dd(pic[v.x][v.y]);dd(v.cnt);de(v.d);
 77             q.push(v);
 78         }
 79     }
 80     return INF;
 81 }
 82 int main()
 83 {
 84 //    ifstream cin("in.txt");
 85     while(cin>>n>>m,n+m){
 86         int ans=INF;
 87         int ok=0;
 88         rep(i,0,n)rep(j,0,m){
 89             cin>>pic[i][j];
 90         }
 91         rep(i,0,n)rep(j,0,m)if(pic[i][j]=='S')
 92         {
 93             ans=bfs(i,j);
 94             goto here;
 95         }
 96         here:;
 97         if(ans!=INF)printf("%d\n",ans);
 98         else puts("-1");
 99     }
100     return 0;
101 }

View Code

转载于:https://www.cnblogs.com/klaycf/p/9692333.html

BFS,优先队列优化相关推荐

  1. 杭电1254java实现(双bfs 优先队列)

    推箱子 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个 ...

  2. P2048 [NOI2010] 超级钢琴(ST表 + 优先队列优化)

    P2048 [NOI2010] 超级钢琴 题目 小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出 ...

  3. dijkstra 的优先队列优化

    既然要学习算法,就要学习到它的精髓,才能够使用起来得心应手. 我还是远远不够啊. 早就知道,dijkstra 算法可以用优先队列优化,我却一直不知道该怎样优化.当时,我的思路是这样的:假设有n个顶点, ...

  4. hdu 1254(dfs+bfs+优先队列)

    推箱子 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Desc ...

  5. 2018南京网络赛L题 Magical Girl Haze(分层图+优先队列优化的dijkstra)

    使用优先队列优化过的dijkstra时间复杂度可以达到O(v*logn),还是很快的. #include <iostream>                //最好是用long long ...

  6. POJ 1511 Invitation Cards——Dijkstra优先队列优化+反向建图

    [题目描述] In the age of television, not many people attend theater performances. Antique Comedians of M ...

  7. nc15665 maze 题解 (传送门) 广搜bfs+优先队列

    maze:原题链接 题目描述: 小明来到一个由n x m个格子组成的迷宫 ,有些格子是陷阱,用'#'表示,小明进入陷阱就会死亡,'.'表示没有陷阱.小明所在的位置用'S'表示,目的地用'T'表示. 小 ...

  8. 洛谷 Golden Sword(dp,优先队列优化【含板子】)|| 补充练习:洛谷 跳房子

    题目链接: 「SWTR-03」Golden Sword - 洛谷 思路: 设表示放第i个原料,锅里共有 j 个时的耐久度之和. 容易知道dp方程为,其中 这样就可以写出暴力dp的代码如下:(需要枚举i ...

  9. Dijkstra算法堆/优先队列优化

    Dijkstra算法堆/优先队列优化 前言 额外知识简介 堆与优先队列 STL库 重载 Dijkstra分析及优化 分析优化 代码实现 存储结构 边 点 优先队列 函数 初始化 添加边 Dijkstr ...

最新文章

  1. Windows 2003 主域控和DNS迁移到Windows 2008 R2(1)
  2. 简单的文本设计就能影响游戏体验?游戏中提升玩家体验的小设计
  3. python转go感觉难_读《我为什么从python转向go》的一些感受
  4. fanuc机器人码垛编程实例_FANUC 机器人码垛编程详细讲解 记得收藏!
  5. PyTorch 系列 | 数据加载和预处理教程
  6. CreateThread和_beginthread的区别
  7. react jquery_2019年React简介(面向仅了解jQuery的人们)
  8. HTML学习思维导图
  9. python安装后无法打开文本_Python 安装zbar-py时出现 无法打开包括文件: “unistd.h” no such file or directory...
  10. 数学家是如何做量化交易的
  11. 【爬虫】爬取个人随手记账户
  12. Guys, what is better than sex?
  13. 从零基础到高级程序员需要走多久?
  14. 2019清华计算机考研名单,2019年清华大学硕士研究生拟录取名单公示(清华MBA,考生编号排序)...
  15. PCI/PCIe 的那些事(1)- 总线基本知识
  16. VS中的工程文件组织
  17. Android屏幕常亮
  18. 安装Redist,运行智慧工厂管理系统
  19. 实现摄像头在内网、外网、gb28181 实现 “视频监控/直播” 的常用几种方式
  20. C++实现最小生成树算法

热门文章

  1. 计算机单片机英语书籍推荐,英语翻译近十几年来,单片机作为微计算机一个很重要的分支,应用广泛,发展迅速,已经对人类社会产生了深远的影响.本文介绍了基...
  2. 22(2)序列化以及反序列化
  3. 基于springmvc、ajax,后台连接数据库的增删改查
  4. Asp.net操作数据库方法
  5. select2 属性标签整理
  6. easyui问题小结
  7. phpmyadmin教程:使用phpmyadmin创建用户
  8. C#父类与子类(多态性)
  9. 你是否觉得.Net Web Service 中asmx文件是多余的?
  10. 成功使用Windows Live Writer 2010发布日志