HDU 2653 (记忆化BFS搜索+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2653
题目大意:迷宫中有普通点和陷阱。其中普通点可以走可以飞,但是陷阱只能飞。走耗时1,飞耗时2。但是飞耗能1。给定一定能量P,问是否能在T秒内走出。
解题思路:
一开始SB似地认为每个点最多访问两次。其实每个点最多可以访问P次。
vis[X][Y][P]表示在(x,y)点能量为P的状态。
容易出错的地方在于这个组合: @. ,虽说是飞吧,但是还是会在陷阱上卡1s,尽管下一个点是. ,但是这种情况是必须飞的。
@@肯定是飞的,..这个就是可飞,可不飞。
BFS树明显是不均衡的,使用优先队列找到的第一个答案就可以return。
#include "cstdio" #include "string" #include "cstring" #include "iostream" #include "queue" using namespace std; char map[85][85]; int n,m,T,p,no,sx,sy,ex,ey,vis[85][85][85],dir[4][2]={-1,0,1,0,0,-1,0,1}; struct status {int x,y,dep,mana;status(int x,int y,int dep,int mana):x(x),y(y),dep(dep),mana(mana) {}bool operator < (const status &a) const {return dep > a.dep;} }; int bfs(int x,int y,int mana) {priority_queue<status> Q;Q.push(status(x,y,0,mana));vis[x][y][mana]=1;while(!Q.empty()){status t=Q.top();Q.pop();if(t.dep>=T) return -1;for(int s=0;s<4;s++){int X=t.x+dir[s][0],Y=t.y+dir[s][1];if(X<1||X>n||Y<1||Y>m||map[X][Y]=='#') continue;if(map[X][Y]=='@'){if(t.mana<1||vis[X][Y][t.mana-1]) continue;vis[X][Y][t.mana-1]=true;Q.push(status(X,Y,t.dep+1,t.mana-1));}else{if(map[t.x][t.y]=='@'&&t.mana<1) continue;if(X==ex&&Y==ey){if(t.mana>=1) return t.dep+1;else return t.dep+2;}if(t.mana>=1||map[t.x][t.y]=='@'){if(!vis[X][Y][t.mana-1]) {vis[X][Y][t.mana-1]=true;Q.push(status(X,Y,t.dep+1,t.mana-1));}}if(map[t.x][t.y]!='@'&&!vis[X][Y][t.mana]) {vis[X][Y][t.mana]=true;Q.push(status(X,Y,t.dep+2,t.mana));}}}}return -1; } int main() {//freopen("in.txt","r",stdin);ios::sync_with_stdio(false);string tt;while(cin>>n>>m>>T>>p){memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){cin>>tt;for(int j=0;j<tt.size();j++){map[i][j+1]=tt[j];if(tt[j]=='Y') {sx=i;sy=j+1;}if(tt[j]=='L') {ex=i;ey=j+1;}}}int ans=bfs(sx,sy,p);cout<<"Case "<<++no<<":"<<endl;if(ans>T||ans==-1) cout<<"Poor Yifenfei, he has to wait another ten thousand years."<<endl;else cout<<"Yes, Yifenfei will kill Lemon at "<<ans<<" sec."<<endl;} }
11892623 | 2014-10-17 12:22:29 | Accepted | 2653 | 218MS | 2956K | 2378 B | C++ | Physcal |
HDU 2653 (记忆化BFS搜索+优先队列)相关推荐
- hdu 4722(记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 思路:简单的记忆化搜索,留意一下A==0时的情况就可以了. 1 #include<iost ...
- hdu 1142 记忆化搜索
题目是这样的,貌似一开始我这个英语搓的人还理解错了...orz http://acm.hdu.edu.cn/showproblem.php?pid=1142 就是最短路,只不过用dijkstra是从终 ...
- hdu 1514 记忆化搜索
题意是给4堆(堆的高度小于等于40)有颜色(颜色的种类小于等于20)的物品,你有一个篮子最多能装5件物品,每次从这4堆物品里面 任取一件物品放进篮子里,但是取每堆物品时,必须先取上面的物品,才能取下面 ...
- HDU 4166 BNU 32715 Robot Navigation (记忆化bfs)
题意:给一个二维地图,每个点为障碍或者空地,有一个机器人有三种操作:1.向前走:2.左转90度:3.右转90度.现给定起点和终点,问到达终点最短路的条数. 思路:一般的题目只是求最短路的长度,但本题还 ...
- hdu 1078 记忆化搜索
题意:给出n*n的格子,每个各自里面有些食物,问一只老鼠每次走最多k步所能吃到的最多的食物 虽然是做过的老题了,但是1A的感觉好爽,对搜索认识更深了 1 #include<cstdio> ...
- 力扣 1553. 吃掉 N 个橘子的最少天数 记忆化DFS|记忆化BFS|剪枝
吃掉 N 个橘子的最少天数 厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. 如果剩余橘子数 n ...
- UVA 10798 - Be wary of Roses(记忆化BFS)
UVA 10798 - Be wary of Roses 题目链接 题意:给定一个地图,人一开始在中心,问选择一种走法走出去,使得面朝任何一个方向走,踩到的花的最大值最小 思路:用优先队列进行BFS, ...
- 【BZOJ - 2574】[Poi1999] Store-Keeper(点双连通分量,求割点,记忆化bfs)
题干: 有一个仓库被分成n*m 个矩形区域,如果两个区域有一条公共边,则被认为这两个区域相邻.包裹都放在一个区域中,剩余的区域或者空闲或者被集装箱占有,这是因为集装箱太重,仓库管理员不能将集装箱搬走. ...
- FZU 2124 - 吃豆人 记忆化BFS..
题意: 吃豆人是一款非常经典的游戏,游戏中玩家控制吃豆人在地图上吃光所有豆子,并且避免被怪物抓住. 这道题没有怪物,将游戏的画面分成n*m的格子,每格地形可能为空地或者障碍物,吃豆人可以在空地上移动, ...
最新文章
- 大数据在统计中的应用初探
- 从Git存储库中删除文件而不从本地文件系统中删除它
- 单调递增最长子序列(南阳理工ACM)
- Cookie与Session的区别
- 性能翻倍 IBM借DS3500拓中低端存储市场
- IBASE and ES change pointer
- 郑洁又淘汰了一个美女瓦伊迪索娃
- python闭环最短路径_深度学习经典算法 | 蚁群算法解析
- 一个基于 SpringBoot 开源的小说和漫画在线阅读网站,简洁大方 !强烈推荐 !
- NMEA0183标准语句
- [JNI]开发之旅(4)项目架构介绍
- Linux安装MySQL安装包下载
- 面试: 华为综合测试
- dnssec_OPNSense上的DNSSEC,DoT和DNSBL
- Python分析上证指数历史数据,发现估值还不够低……
- java-net-php-python-java宿舍管理系统计算机毕业设计程序
- 贷记、借记、来帐、往账的区别
- python做事件研究法_35行代码搞定事件研究法(上)
- 程序员的系统桌面应该是这样的
- 【深浅拷贝的实现方式】