HDU2653 BFS+优先队列
Waiting ten thousand years for Love
Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1057 Accepted Submission(s): 335
was ten thousand years, after Demon Lemon caught Yifenfei’s love. In
order to revenge and save his love, Yifenfei have been practising sword
all day long and his Kongfu skills becomes so powerful that he can kill
Demon Lemon immediately. Recently, Yifenfei have found Lemon’s castle,
and now he is going to kill Lemon. At the same time, hearing about the
terrible news, Demon Lemon is now preparing for escaping...
Now Yifenfei has got the map of the castle.
Here are all symbols of the map:
Only one ‘Y’ Indicates the start position of Yifenfei.
Only one ‘L’ Indicates the position of Demon Lemon.
‘.’ Indicate the road that Yifenfei can walk on it, or fly over it.
‘#’ Indicate the wall that Yifenfei can not walk or flay through it.
‘@’ Indicate the trap that Yifenfei can not walk on it, but can fly over it.
Yifenfei
can walk or fly to one of up, down, left or right four directions each
step, walk costs him 2 seconds per step, fly costs him 1 second per step
and 1 magic power. His magic power will not increased, and if his magic
power is zero, he can not fly any more.
Now Yifenfei asks you
for helping him kill Demon Lemon smoothly. At the same time, Demon Lemon
will Leave the castle Atfer T seconds. If Yifenfei can’t kill Demon
Lemon this time, he have to wait another ten thousand years.
of test cases, please process to end of file. In each test case,
firstly will have four integers N, M, T, P(1 <= N, M, P <= 80, 1
<= T <= 100000), indicates the size of map N * M, the Lemon’s
leaving time(after T seconds, Lemon will disappeared) and Yifenfei’s
magic power. Then an N * M two-dimensional array follows indicates the
map.
each test case, first Print a line “Case C:”, C indicates the case
number. Then, if Yifenfei can kill Demon Lemon successfully, Print “Yes,
Yifenfei will kill Lemon at T sec.”, T indicates the minimum seconds he
must cost. Otherwise, Print ”Poor Yifenfei, he has to wait another ten
thousand years.”
Yes, Yifenfei will kill Lemon at 2 sec.
Poor Yifenfei, he has to wait another ten thousand years.
Yes, Yifenfei will kill Lemon at 4 sec.
Poor Yifenfei, he has to wait another ten thousand years.
Hint
Case 1: Yifenfei cost 1 second and 1 magic-power fly to ‘@’,
but he can not step on it, he must cost another 1 second
and 1 magic-power fly to ‘L’ and kill Lemon immediately.
Case 2: When Yifenfei Fly to ‘@’, he has no power to fly,
and is killed by trap.
//卡了很长时间,后来发现别人的题解vis是三维。
//显然要用到优先队列,本题的vis不是只访问一次,可以访问P次,因为以不同的能量值经过同一点的方案肯定是不同的。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,t,p;
char map[][];
bool vis[][][];
int dir[][]={,,-,,,,,-};
struct Lu
{
int x,y,cnt,mag;
friend bool operator<(Lu a,Lu b)
{
return a.cnt>b.cnt;
}
};
int bfs(int sx,int sy)
{
priority_queue<Lu>q;
Lu L1,L2;
L1.x=sx;L1.y=sy;L1.cnt=;L1.mag=p;
vis[sx][sy][p]=;
q.push(L1);
while(!q.empty())
{
L2=q.top();
q.pop();
if(L2.cnt>t)
return ;
if(map[L2.x][L2.y]=='L')
return L2.cnt;
for(int i=;i<;i++)
{
L1.x=L2.x+dir[i][];
L1.y=L2.y+dir[i][];
if(L1.x<||L1.x>=n||L1.y<||L1.y>=m) continue;
if(map[L1.x][L1.y]=='#') continue;
if(L2.mag>&&!vis[L1.x][L1.y][L2.mag-])
{
L1.cnt=L2.cnt+;
L1.mag=L2.mag-;
vis[L1.x][L1.y][L1.mag]=;
q.push(L1);
}
if(map[L1.x][L1.y]!='@'&&map[L2.x][L2.y]!='@'&&!vis[L1.x][L1.y][L2.mag])
{
L1.cnt=L2.cnt+;
L1.mag=L2.mag;
vis[L1.x][L1.y][L2.mag]=;
q.push(L1);
}
}
}
return ;
}
int main()
{
int sx,sy,k=;
while(scanf("%d%d%d%d",&n,&m,&t,&p)!=EOF)
{
k++;
for(int i=;i<n;i++)
{
scanf("%s",map[i]);
for(int j=;j<m;j++)
if(map[i][j]=='Y')
{
sx=i;sy=j;
}
}
memset(vis,,sizeof(vis));
int ans=bfs(sx,sy);
printf("Case %d:\n",k);
if(ans>t) printf("Poor Yifenfei, he has to wait another ten thousand years.\n");
else printf("Yes, Yifenfei will kill Lemon at %d sec.\n",ans);
}
return ;
}
HDU2653 BFS+优先队列的更多相关文章
- POJ 1724 ROADS(BFS+优先队列)
题目链接 题意 : 求从1城市到n城市的最短路.但是每条路有两个属性,一个是路长,一个是花费.要求在花费为K内,找到最短路. 思路 :这个题好像有很多种做法,我用了BFS+优先队列.崔老师真是千年不变 ...
- hdu 1242 找到朋友最短的时间 (BFS+优先队列)
找到朋友的最短时间 Sample Input7 8#.#####. //#不能走 a起点 x守卫 r朋友#.a#..r. //r可能不止一个#..#x.....#..#.##...##...#.... ...
- HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)
题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...
- hdu1839(二分+优先队列,bfs+优先队列与spfa的区别)
题意:有n个点,标号为点1到点n,每条路有两个属性,一个是经过经过这条路要的时间,一个是这条可以承受的容量.现在给出n个点,m条边,时间t:需要求在时间t的范围内,从点1到点n可以承受的最大容量... ...
- BFS+优先队列+状态压缩DP+TSP
http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others) Memo ...
- POJ - 2312 Battle City BFS+优先队列
Battle City Many of us had played the game "Battle city" in our childhood, and some people ...
- HDU 1242 -Rescue (双向BFS)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
- hdu 2102 A计划 具体题解 (BFS+优先队列)
题目链接:pid=2102">http://acm.hdu.edu.cn/showproblem.php?pid=2102 这道题属于BFS+优先队列 開始看到四分之中的一个的AC率感 ...
- D. Lunar New Year and a Wander bfs+优先队列
D. Lunar New Year and a Wander bfs+优先队列 题意 给出一个图,从1点开始走,每个点至少要经过一次(可以很多次),每次经过一个没有走过的点就把他加到走过点序列中,问最 ...
随机推荐
- C#模拟鼠标键盘控制其他窗口(一)
编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口.比如,操作飞信定时发送短信等.我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的执行,开发 ...
- Windows - 杀死占用某个端口号的进程
Windows不像Linux,Unix那样,ps -ef 查出端口和进程号,然后根据进程号直接kill进程. Windows根据端口号杀死进程要分三步: 第一步 根据 端口号 寻找 进程号 C:\&g ...
- 【安卓】安卓res文件夹下的资源文件与R.java文件里面类的对应关系
对于drawable.layout.menu文件夹下的每一个文件都分别会在R.java文件里面生成drawable.layout.menu类的一个常量,类名就是文件夹的名字,常量的名字就是文件名字. ...
- migration integer limit option
https://gist.github.com/stream7/1069589 :limit Numeric Type Column Size Max value 1 tinyint 1 byte 1 ...
- 提取刷机包内system.new.dat文件
转换 使用python脚本sdat2img来完成 sdat2img.py system.transfer.list system.new.dat system.img 输出信息 Skipping co ...
- PHP - xhprof+Graphviz 安装配置
简介:XHProf是Facebook放出的轻量级调试工具.和Xdebug相比,XHProf更加易用和可控,尤其是生成流程图和调试数据对比的功能很好很强大. 参考:http://us2.php.net/ ...
- appium 处理动态控件
环境怎么搭建,参考:http://www.cnblogs.com/tobecrazy/p/4562199.html 知乎Android客户端登陆:http://www.cnblogs.com/tobe ...
- CI 笔记一
CodeIgniter 说明 CodeIgniter 是为PHP 开发人员提供的一套Web 应用程序工具包.它的目标是能 够让你比从零开始更加快速的完成项目,它提供了一套丰富的的类库来满足我们日常 的 ...
- .NET LINQ 相等运算
相等运算 如果两个序列的对应元素相等且这两个序列具有相同数量的元素,则视这两个序列相等. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 Seq ...
- linux操作oracle
1.su - oracle 2.sqlplus / as sysdba; 1.登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切换成oracle用 ...