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. 非常适合新手的jq/zepto源码分析07---ajax的封装

    复习下ajax吧! 1.创建XMLHttpRequest对象 xmlhttp=new XMLHttpRequest(); xmlhttp=new ActiveXObject("Microso ...

  2. Android GIS开发系列-- 入门季(4) GraphicsLayer的点击查询要素

    上一讲中我们学会了如何在MapView中添加Graphic要素,那么在百度或高德地图中,当我们点击要素时,会显示出相应的详细信息.在GraphicsLayer中也提供了这样的方法.下面我们来学习在Gr ...

  3. sqlacodegen

    这个工具可以把数据库的表转成sqlalchemy用的class. 但是 table必须要有主键.否则转化成的是Table类型而不是class root@rijx:/tmp# sqlacodegen - ...

  4. Jupyter Notebook: 解决build docker-stacks时conda太慢的问题

    当想使用docker安装Jupyter Notebook时,有一个很好的项目是docker-stacks(https://github.com/jupyter/docker-stacks/tree/m ...

  5. QQ加群组件-iPhone、Android、网页上加入QQ群

    iPhone代码: - (BOOL)joinGroup:(NSString *)groupUin key:(NSString *)key{ NSString *urlStr = [NSString s ...

  6. 学习C语言,困难吗?

            要说计算机如今什么最火.无异于网络.看看各大计算机站点,满眼尽是网络project师,什么IP啊,路由啊,虚拟机啊,总之,操作性的计算机技能牢牢占领了半壁江山. 这些技巧当然重要.可是 ...

  7. mysql 常用查询语句记录

    SELECT DISTINCT CONCAT('User: ''',USER,'''@''',HOST,''';') AS QUERY FROM mysql.user; GRANT USAGE ON ...

  8. oc78--NSFileManager

    // main.m // NSFileManager #import <Foundation/Foundation.h> int main(int argc, const char * a ...

  9. jsp注释前台不可见

    <%-- <div class="content"></div> --%>

  10. js【面向过程编程】、好、 【init()、 GetData()、 bindData()、bindDom、 bindEvent()、buyProduct()、AddProductToCart()】*****************

    1. 一般页面开发方式 [可读性差.可维护性差]------初级开发工程师 一般页面编写方法 var name = 'iphone8' var description = '手机中的战斗机 ' var ...