HDU1026(延时迷宫:BFS+优先队列)
Ignatius and the Princess I
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16713 Accepted Submission(s): 5327
Special Judge
1.Ignatius can only move in four directions(up, down, left, right), one step per second. A step is defined as follow: if current position is (x,y), after a step, Ignatius can only stand on (x-1,y), (x+1,y), (x,y-1) or (x,y+1).
2.The array is marked with some characters and numbers. We define them like this:
. : The place where Ignatius can walk on.
X : The place is a trap, Ignatius should not walk on it.
n : Here is a monster with n HP(1<=n<=9), if Ignatius walk on it, it takes him n seconds to kill the monster.
Your task is to give out the path which costs minimum seconds for Ignatius to reach target position. You may assume that the start position and the target position will never be a trap, and there will never be a monster at the start position.
#include <iostream>
#include <queue>
using namespace std;
const int MAXN=;
const int INF=0x3f3f3f3f;
struct Node{
int y,x,hp,step,id,pre;
Node(){}
Node(int y,int x,int hp,int step,int id,int pre)
{
this->y=y;
this->x=x;
this->hp=hp;
this->step=step;
this->id=id;
this->pre=pre;
}
bool operator<(const Node& no)const
{
return step > no.step;
}
}path[];
int tot;
int n,m;
int t[MAXN][MAXN];
char mz[MAXN][MAXN];
int dy[]={,,,-};
int dx[]={,,-,};
int start;
int time;
void print(int k)
{
Node now=path[k];
if(now.pre==-)
{
++time;
cout<<time<<"s:("<<now.y<<","<<now.x<<")->";
return ;
}
print(now.pre);
cout<<"("<<now.y<<","<<now.x<<")"<<endl;
for(int i=;i<now.hp;i++)
{
++time;
cout<<time<<"s:FIGHT AT ("<<now.y<<","<<now.x<<")"<<endl;
}
time++;
if(k!=start) cout<<time<<"s:("<<now.y<<","<<now.x<<")->";
}
void bfs()
{
tot=;
for(int i=;i<MAXN;i++)
for(int j=;j<MAXN;j++)
t[i][j]=INF;
priority_queue<Node> que;
Node now(,,,,tot,-);
path[tot++]=now;
que.push(now);
t[][]=;
while(!que.empty())
{
now=que.top();que.pop();
if(now.y==n-&&now.x==m-)
{
start=now.id;
cout<<"It takes "<<path[start].step<<" seconds to reach the target position, let me show you the way."<<endl;
time=;
print(start);
return ;
}
for(int i=;i<;i++)
{
int ny=now.y+dy[i];
int nx=now.x+dx[i];
if(<=ny&&ny<n&&<=nx&&nx<m&&mz[ny][nx]!='X')
{
int hp=;
if(mz[ny][nx]!='.') hp=hp+mz[ny][nx]-'';
int nstep=now.step+hp+;
if(nstep<t[ny][nx])
{
t[ny][nx]=nstep;
Node next=Node(ny,nx,hp,nstep,tot,now.id);
que.push(next);
path[tot++]=next;
}
}
}
}
cout<<"God please help our poor hero."<<endl;
}
int main()
{
while(cin>>n>>m)
{
for(int i=;i<n;i++)
cin>>mz[i];
bfs();
cout<<"FINISH"<<endl;
}
return ;
}
HDU1026(延时迷宫:BFS+优先队列)的更多相关文章
- HDOJ1242(延时迷宫BFS+优先队列)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1728 逃离迷宫 BFS加优先队列 DFS()
http://acm.hdu.edu.cn/showproblem.php?pid=1728 题意就是能否在规定的转弯次数内从起点走到终点.刚走时那步方向不算. 只会bfs(),但想到这题需要记录转弯 ...
- BFS+优先队列+状态压缩DP+TSP
http://acm.hdu.edu.cn/showproblem.php?pid=4568 Hunter Time Limit: 2000/1000 MS (Java/Others) Memo ...
- hdu 2102 A计划 具体题解 (BFS+优先队列)
题目链接:pid=2102">http://acm.hdu.edu.cn/showproblem.php?pid=2102 这道题属于BFS+优先队列 開始看到四分之中的一个的AC率感 ...
- 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可以承受的最大容量... ...
- POJ - 2312 Battle City BFS+优先队列
Battle City Many of us had played the game "Battle city" in our childhood, and some people ...
随机推荐
- Android笔记之使用Glide加载网络图片、下载图片
Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...
- Linux中的man
1.查看命令的帮助信息 man mkdir 2.查看服务配置文件的帮助信息 man services 说明: a.如果没有man通过yum install man安装 b.如果命令和服务同名了,那就指 ...
- Js自定义异常
function MyError(msg){ this.name="MyError"; this.message = msg || "自定义异常的默认消息";} ...
- pip-grep
Pip-pop pip-grep主要是用于方便查看Requirements.txt中那些模块是安装了的.也就是通过输入的然后模块名称然后在Requirements.txt中进行查询.里面比较难的就是d ...
- You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
[root@localhost dreamstart]# composer installLoading composer repositories with package informationI ...
- 学习使用MarkDown
文本采用CuteMarkEd软件编写后复制到博客园(这个软件可以实时观看html效果,也可以打印pdf,挺好使.测试比sublime装插件要简单方便) MarkDown格式文本 名称 ======== ...
- VMware下所有的系统网卡启动不起来
昨天新装了一台Linux,装好之后网络起不来,搞了半天也没弄好,总是报错: Failed to start LSB: Bring up/down networking.... 我以为是我的设置出了问题 ...
- ubuntu vim退出时出错
E505: "vimrc" is read-only (add ! to override) wq退出时加!强制保存退出 "vimrc" E212: Can't ...
- Spring声明式事务管理与配置介绍
转至:http://java.9sssd.com/javafw/art/1215 [摘要]本文介绍Spring声明式事务管理与配置,包括Spring声明式事务配置的五种方式.事务的传播属性(Propa ...
- 3.08课·········switch case及if else嵌套(日期格式)
switch case switch (n) { : break; : break; . . . case n: break; } 1.switch case必须与break一同使用,每一个case后 ...