Ignatius and the Princess I

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16456    Accepted Submission(s):
5221
Special Judge

Problem Description
The Princess has been abducted by the BEelzebub
feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into
feng5166's castle. The castle is a large labyrinth. To make the problem simply,
we assume the labyrinth is a N*M two-dimensional array which left-top corner is
(0,0) and right-bottom corner is (N-1,M-1). Ignatius enters at (0,0), and the
door to feng5166's room is at (N-1,M-1), that is our target. There are some
monsters in the castle, if Ignatius meet them, he has to kill them. Here is some
rules:

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.

 
Input
The input contains several test cases. Each test case
starts with a line contains two numbers N and M(2<=N<=100,2<=M<=100)
which indicate the size of the labyrinth. Then a N*M two-dimensional array
follows, which describe the whole labyrinth. The input is terminated by the end
of file. More details in the Sample Input.
 
Output
For each test case, you should output "God please help
our poor hero." if Ignatius can't reach the target position, or you should
output "It takes n seconds to reach the target position, let me show you the
way."(n is the minimum seconds), and tell our hero the whole path. Output a line
contains "FINISH" after each test case. If there are more than one path, any one
is OK in this problem. More details in the Sample Output.
 
Sample Input
5 6
.XX.1.
..X.2.
2...X.
...XX.
XXXXX.
5 6
.XX.1.
..X.2.
2...X.
...XX.
XXXXX1
5 6
.XX...
..XX1.
2...X.
...XX.
XXXXX.
 
Sample Output
It takes 13 seconds to reach the target position, let me show you the way.
1s:(0,0)->(1,0)
2s:(1,0)->(1,1)
3s:(1,1)->(2,1)
4s:(2,1)->(2,2)
5s:(2,2)->(2,3)
6s:(2,3)->(1,3)
7s:(1,3)->(1,4)
8s:FIGHT AT (1,4)
9s:FIGHT AT (1,4)
10s:(1,4)->(1,5)
11s:(1,5)->(2,5)
12s:(2,5)->(3,5)
13s:(3,5)->(4,5)
FINISH
It takes 14 seconds to reach the target position, let me show you the way.
1s:(0,0)->(1,0)
2s:(1,0)->(1,1)
3s:(1,1)->(2,1)
4s:(2,1)->(2,2)
5s:(2,2)->(2,3)
6s:(2,3)->(1,3)
7s:(1,3)->(1,4)
8s:FIGHT AT (1,4)
9s:FIGHT AT (1,4)
10s:(1,4)->(1,5)
11s:(1,5)->(2,5)
12s:(2,5)->(3,5)
13s:(3,5)->(4,5)
14s:FIGHT AT (4,5)
FINISH
God please help our poor hero.
FINISH
 
这个题应该可以算是基础搜索吧,很久没做搜索了,在题解的帮助下成功ac。保存路径的思想以后可以借鉴。使用了优先队列。
使用优先队列,队头一直是当前耗时最小的,这个运算符重载要记住。
用flag数组保存这个结点是从哪个方向来的,每个点的方向只会更新一次,因为第一次到达该点为最优(也可以理解为到了过后就用vis标记),用于记录路径,递归回溯输出。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
#define INF 999999999 struct Node
{
int x,y;
int tim;
friend bool operator<(Node a,Node b)
{
return a.tim>b.tim;
}
}; char map[][];
int dir[][]= {{-,},{,},{,},{,-}};
int flag[][];
int vis[][];
int n,m; bool inside(Node nn)
{
if(nn.x>=&&nn.x<n&&nn.y>=&&nn.y<m)
return ;
return ;
} int ans=INF; priority_queue<Node> pq;
int bfs()
{
Node sta;
sta.x=;
sta.y=;
sta.tim=;
pq.push(sta);
vis[sta.x][sta.y]=;
while(!pq.empty())
{
Node now=pq.top();
if(now.x==n-&&now.y==m-)
return ;
pq.pop();
for(int i=;i<;i++)
{
Node next;
next.x=now.x+dir[i][];
next.y=now.y+dir[i][];
if(!vis[next.x][next.y]&&inside(next)&&map[next.x][next.y]!='X')
{
flag[next.x][next.y]=i+;
if(map[next.x][next.y]=='.')
next.tim=now.tim+;
else
next.tim=now.tim++map[next.x][next.y]-'';
pq.push(next);
vis[next.x][next.y]=;
}
}
}
return ;
} void printpath(int x,int y,int time)
{
if(flag[x][y]==)
return;
int add=;
if(map[x][y]!='.')
add=map[x][y]-'';
printpath(x-dir[flag[x][y]-][],y-dir[flag[x][y]-][],time--add);
if(map[x][y]!='.')
{
printf("%ds:(%d,%d)->(%d,%d)\n",time-add,x-dir[flag[x][y]-][],y-dir[flag[x][y]-][],x,y);
for(int i=;i<=map[x][y]-'';i++)
printf("%ds:FIGHT AT (%d,%d)\n",time-add+i,x,y);}
else
printf("%ds:(%d,%d)->(%d,%d)\n",time,x-dir[flag[x][y]-][],y-dir[flag[x][y]-][],x,y);
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,,sizeof(vis));
memset(flag,,sizeof(flag));
while(!pq.empty())
pq.pop();
memset(vis,,sizeof(vis));
for(int i=; i<n; i++)
scanf("%s",map[i]);
int findit=bfs();
if(findit)
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n",pq.top().tim);
printpath(pq.top().x,pq.top().y,pq.top().tim);
}
else
printf("God please help our poor hero.\n");
printf("FINISH\n");
}
return ;
}

HDU_1026_Ignatius and the Princess I_BFS(保存路径)的更多相关文章

  1. hdoj 1026 Ignatius and the Princess I 最小步数,并且保存路径

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

  2. 如何更改gnome-screenshot的默认的保存路径?

    参考这篇文章: http://www.itye.org/archives/3121 首先, 在dconf-editor中设置, screenshot的自动保存路径: auto-save-directo ...

  3. [转]as3中的SharedObject的保存路径

    SharedObject的保存路径 Windows XP 网络访问: C:\Documents and Settings\[你的用户名]\Application Data\Macromedia\Fla ...

  4. HDU--杭电--1026--Ignatius and the Princess I--广搜--直接暴力0MS,优先队列的一边站

    别人都是广搜+优先队列,我没空临时学,所以就直接自己暴力了 Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)     ...

  5. 如何查看PYTHON Django的保存路径

    如何查看PYTHON Django的保存路径 $ python -c " import sys sys.path = sys.path[1:] import django print(dja ...

  6. HDU 1026 Ignatius and the Princess I(带路径的BFS)

    http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:给出一个迷宫,求出到终点的最短时间路径. 这道题目在迷宫上有怪物,不同HP的怪物会损耗不同的时间,这 ...

  7. hdu 1026(Ignatius and the Princess I)BFS

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

  8. SQL Server Management Studio 2012 设置脚本默认保存路径

    特别说明,本文是从这里 修改SQL Server Management Studio默认设置提高开发效率. "抄过来的",为方便个人记忆才写此文(非常感谢这哥们儿的分享.) 原文地 ...

  9. hdu acm 1028 数字拆分Ignatius and the Princess III

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

随机推荐

  1. 淘宝手机rem的如何使用

    1.主要介绍几个移动端常用的单位rem.vw.vh,配合传统的px.百分比.<viewport>标签,兼容适配移动端的各种分辨率的手机端. rm : 这个单位是以父元素为标准来进行计算 , ...

  2. Linux: Start and Enable firewall

    enable firewall systemctl enable firewalld start firewall systemctl start firewalld check firewall s ...

  3. Windows 文件夹修改为exe的原理和解决办法

    有关文件夹后缀改为exe的病毒 该病毒之前出现过,不过没多长时间便消失了,最新的这个应该是变种,下面解决一下该病毒在移动存储设备中的问题: 该病毒并不具备能够将文件夹改为文件的能力,只是将原有文件夹全 ...

  4. cc2540 cc2541 开发板资料更新日志

    经过多次PCB打样和全面调试.已经完毕了cc2540 cc2541的开发板的批量贴片.硬件告一段落, 接下来是全面完好软件方面的工作.眼下已经针对没有开发经验的用户编写完毕0基础基础实验代码和教程.接 ...

  5. 【ubuntu firefox】 Firefox is already running, but is not responding

    在ubuntu下启动firefox报错 Firefox is already running, but is not responding. To open a new window, you mus ...

  6. SOA究竟是个啥

    SOA(Service-Oriented Architecture),中文全称:面向服务的架构. SOA让把系统分离成不同的服务,使用接口来进行数据交互,终于达到整合系统的目的. 专业的词总是让人懵懵 ...

  7. Mariadb-lib

    mariadb-libs-5.5.44-2.el7.centos.x86_64

  8. js获取request参数值(javascript 获取request参数值的方法)

    jsp 中的js,可以用el表达式来提取:var value = "${requestScope.XXX}"; 注:XXX为你的参数名 如:http://localhost:808 ...

  9. istio-禁用/允许sidecar设置

    一.在namespace设置自动注入: 给 default 命名空间设置标签:istio-injection=enabled: $ kubectl label namespace default is ...

  10. error: undefined reference to 'property_set (转载)

    转自:http://blog.csdn.net/u011589606/article/details/23474241 in the cpp file, please include #include ...