题意:

'S' : 起点

'T' : 终点

'#' : 毒气室

'B' :氧气

'P':不消耗步数

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

solution:

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

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

携带超过5个跳过氧气B

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

 #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pw(x) (1ll << (x))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define rep(i,l,r) for(int i=(l);i<(r);++i)
#define per(i,l,r) for(int i=(r)-1;i>=(l);--i)
#define maxn 500005
#define eps 1e-9
#define PIE acos(-1)
#define dd(x) cout << #x << " = " << (x) << ", "
#define de(x) cout << #x << " = " << (x) << "\n"
#define endl "\n"
#define INF 0x3f3f3f3f
using namespace std;
typedef double db;
typedef long long LL;
typedef vector<int> vi;
typedef pair<int, int> pii;
//----------------------
int n,m;
char pic[][];
bool vis[][][];
const int dir[][]={{-,},{,},{,},{,-}};
struct Node{
int x;
int y;
int d=;
int cnt=;
bool operator<(const Node& a)const{
return d>a.d;
}
}start,u,v;
int cnt;
bool check(Node v)
{
return v.x>=&&v.x<n&&v.y>=&&v.y<m;
}
int bfs(int x,int y)//把#当路障,找氧气瓶
{
memset(vis,,sizeof(vis));
priority_queue<Node>q;
vis[x][y][]=;
start.x=x;start.y=y;start.d=;start.cnt=;
q.push(start);
while(!q.empty())
{
u=q.top();q.pop();
if(pic[u.x][u.y]=='T'){return u.d;}
rep(i,,){
v=u;
v.x+=dir[i][];
v.y+=dir[i][];
if(!check(v))continue;
if(pic[v.x][v.y]=='#'){
if(v.cnt>=)v.cnt--,v.d++;
else continue;
}
else if(pic[v.x][v.y]=='B'){
if(v.cnt>=)continue;
else v.cnt++;
}
else if(pic[v.x][v.y]=='P')v.d--;
v.d++;
if(vis[v.x][v.y][v.cnt])continue;
vis[v.x][v.y][v.cnt]=;
// dd(v.x+1);dd(v.y+1);dd(pic[v.x][v.y]);dd(v.cnt);de(v.d);
q.push(v);
}
}
return INF;
}
int main()
{
// ifstream cin("in.txt");
while(cin>>n>>m,n+m){
int ans=INF;
int ok=;
rep(i,,n)rep(j,,m){
cin>>pic[i][j];
}
rep(i,,n)rep(j,,m)if(pic[i][j]=='S')
{
ans=bfs(i,j);
goto here;
}
here:;
if(ans!=INF)printf("%d\n",ans);
else puts("-1");
}
return ;
}

BFS,优先队列优化的更多相关文章

  1. HDU 6386 Age of Moyu 【BFS + 优先队列优化】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6386 Age of Moyu Time Limit: 5000/2500 MS (Java/Others ...

  2. HDU 2822 (BFS+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2822 题目大意:X消耗0,.消耗1, 求起点到终点最短消耗 解题思路: 每层BFS的结点,优先级不同 ...

  3. hdu-1026(bfs+优先队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:输入n,m和一个n*m的矩阵, .表示通路: x表示墙: n表示有一个怪物,消灭它需要n个 ...

  4. hdu1026(bfs+优先队列+打印路径)

    Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  5. HDU 1242 -Rescue (双向BFS)&amp;&amp;( BFS+优先队列)

    题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...

  6. HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...

  7. dijkstra算法之优先队列优化

    github地址:https://github.com/muzhailong/dijkstra-PriorityQueue 1.题目 分析与解题思路 dijkstra算法是典型的用来解决单源最短路径的 ...

  8. 地铁 Dijkstra(优先队列优化) 湖南省第12届省赛

    传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /******************************** ...

  9. POJ 1724 ROADS(BFS+优先队列)

    题目链接 题意 : 求从1城市到n城市的最短路.但是每条路有两个属性,一个是路长,一个是花费.要求在花费为K内,找到最短路. 思路 :这个题好像有很多种做法,我用了BFS+优先队列.崔老师真是千年不变 ...

  10. 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)

    再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个 ...

随机推荐

  1. moment日期格式化插件

    Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率.日常开发中,通常会对时间进行下面这几个操作:比如获取时间,设置时间,格式化时间,比较时间等等 ...

  2. mysql in 中使用子查询,会不使用索引而走全表扫描

    所以可以将 in 条件中 子查询转换成一张子表,从而通过 join 的形式进行条件限制.

  3. android提升

    https://blog.csdn.net/lou_liang/article/details/82856531

  4. mysql中varchar可以存多少汉字

    汉字长度与编码有关 MySql 5.0 以上的版本: 1.一个汉字占多少长度与编码有关: UTF-8:一个汉字 = 3个字节,英文是一个字节 GBK: 一个汉字 = 2个字节,英文是一个字节 2.va ...

  5. 十九,基于helm搭建EFK日志收集系统

    目录 EFK日志系统 一,EFK日志系统简介: 二,EFK系统部署 1,EFK系统部署方式 2,基于Helm方式部署EFK EFK日志系统 一,EFK日志系统简介: 关于系统日志收集处理方案,其实有很 ...

  6. Django框架orm

    一.django目录 二.登录注册 三.三件套 四.orm简介 五.基于orm的用户登录 一.django目录 -settings -urls -views -强调:setting中的'django. ...

  7. vim文本编辑及文件查找应用4

    linux系统上的特殊权限 : 特殊权限有:SUID,SGID,STICKY 安全上下文: 1.进程以其发起者的身份运行:进程对文件的访问权限,取决于发此进程的用户的权限:进程是发起些进程用户的代理, ...

  8. c#客户端自动更新模块

    一.概述 将需要更新的文件上传到服务器端,然后客户端从服务器下载更新文件并覆盖本地文件. 二.功能模块 1.将更新文件放入指定文件夹,检测更新,生成更新配置文件,并上传到服务器 2.获取服务器的更新配 ...

  9. solr 分面搜索(转载)

    原文地址:http://blog.csdn.net/bingduanlbd/article/details/52199347 分面搜索(Faceting)基于索引词项对搜索结果进行分类,同时返回每个分 ...

  10. 集合(一)-Java中Arrays.sort()自定义数组的升序和降序排序

    默认升序 package peng; import java.util.Arrays;  public class Testexample { public static void main(Stri ...