BFS,优先队列优化
题意:
'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,优先队列优化的更多相关文章
- 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 ...
- HDU 2822 (BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2822 题目大意:X消耗0,.消耗1, 求起点到终点最短消耗 解题思路: 每层BFS的结点,优先级不同 ...
- hdu-1026(bfs+优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:输入n,m和一个n*m的矩阵, .表示通路: x表示墙: n表示有一个怪物,消灭它需要n个 ...
- hdu1026(bfs+优先队列+打印路径)
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- HDU 1242 -Rescue (双向BFS)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
- HDU6582 Path【优先队列优化最短路 + dinic最大流 == 最小割】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6582 来源:2019 Multi-University Training Contest 1 题目大意 ...
- dijkstra算法之优先队列优化
github地址:https://github.com/muzhailong/dijkstra-PriorityQueue 1.题目 分析与解题思路 dijkstra算法是典型的用来解决单源最短路径的 ...
- 地铁 Dijkstra(优先队列优化) 湖南省第12届省赛
传送门:地铁 思路:拆点,最短路:拆点比较复杂,所以对边进行最短路,spfa会tle,所以改用Dijkstra(优先队列优化) 模板 /******************************** ...
- POJ 1724 ROADS(BFS+优先队列)
题目链接 题意 : 求从1城市到n城市的最短路.但是每条路有两个属性,一个是路长,一个是花费.要求在花费为K内,找到最短路. 思路 :这个题好像有很多种做法,我用了BFS+优先队列.崔老师真是千年不变 ...
- 最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)
再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个 ...
随机推荐
- OnePlus5刷 TWRP
# 安装adb apt install adb # 安装fastboot apt install fastboot # 进入bootloader模式 adb reboot bootloader # 刷 ...
- mybatis generator代码生成器的使用
一.有关mybatis generator的使用可以查看如下网址:http://www.mybatis.org/generator/index.html 二.如下是我自己整理的学习步骤: <1& ...
- flutter问题集锦
现在的多平台开发很多啦,目前主流的救赎react native 和weex了,其他的旧的就不说了,新出来的gomobile目前基本无人使用,底层的很多原生对接还没有完善,flutter发布了第一版正式 ...
- 5.API详解
Dao 中需要通过 SqlSession 对象来操作 DB.而 SqlSession 对象的创建, 需要其工厂对象 SqlSessionFactory.SqlSessionFactory 对象, 需要 ...
- 【jekins】tomcat+jenkins
启动jiekins:进入tomcat安装路径下的bin文件,运行startup.bat文件 打开http://127.0.0.1:8080/jenkins 地址 一.构建github项目 原理:构建项 ...
- Image Processing and Analysis_8_Edge Detection:A Computational Approach to Edge Detection——1986
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- 发送短信——java
闲来无事研究一下调用第三方接口发送短信的技术 这一次我们使用阿里的短信服务 一.进行平台相关服务的注册和设置 下面请参照阿里的短信服务文档进行设置,只要按照文档步骤来差不多30分钟就能搞定服务注册: ...
- touchgfx -- Integration
将UI连接到系统 在大多数应用程序中,UI需要以某种方式连接到系统的其余部分,并发送和接收数据.这可以与硬件外围设备(传感器数据,A / D转换,串行通信等)接口,也可以与其他软件模块接口. 本文介绍 ...
- sql 连接数查询
SELECT * FROM master.dbo.sysprocesses WHERE dbid IN ( SELECT dbid FROM master.dbo.sysdatabases WHERE ...
- integer == 号问题
integer a=123 integer b=123 integer c=250 integer d=250 a==b(true) c==d (false) Integer中把-128-127 缓存 ...