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. 【sql技巧】mysql修改时,动态指定要修改的字段 update `table` set (case when ....) = 1 where id = xx

    如果你点进了这篇帖子,那么你一定遇到了跟我一样的问题.别看题目的set case when...,我一开始也是第一反应是用case when但是发现并不好使. 问题呢,说得高大上一点:动态指定要修改的 ...

  2. 9、Java并发性和多线程-线程安全与共享资源

    以下内容转自http://ifeve.com/thread-safety/: 允许被多个线程同时执行的代码称作线程安全的代码.线程安全的代码不包含竞态条件.当多个线程同时更新共享资源时会引发竞态条件. ...

  3. 多Tabs的横向滚动插件(支持Zepto和jQuery)

    一. 效果图 二. 功能介绍 1. 支持横向移动 2. 支持点击Tab后该Tab居中 3. 拉到最左边和最右边后依然可以拉动,只是tabs的移动距离变小. 三. 使用说明 1. 在你的html中添加T ...

  4. Mentor.Graphics.FloTHERM.XT.2.3+Mentor.Graphics.Flowmaster.7.9.4

    Mentor.Graphics.FloTHERM.XT.2.3 Mentor.Graphics.Flowmaster.7.9.4 AVL.CRUISE.V2015.0-车辆动力学仿真分析平台 AVL. ...

  5. PS和AI软件差别

    首先.PS是处理位图图像的.AI是处理矢量图图形的.那就先说一下两者最主要的问题,位图与矢量图的差别和优缺点.  在计算机画图领域中.依据成图原理和绘制方法的不同.数字图形.图像分为"矢量图 ...

  6. [LeetCode] 035. Search Insert Position (Medium) (C++)

    索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 035. Sea ...

  7. The return type is incompatible with JspSourceDependent.getDependants():JasperException问题分析与解决方法

    Linux下基于JSP的报表集成到项目中后,显示不出来,查看tomcat的日志.有例如以下报错信息: The return type is incompatible with JspSourceDep ...

  8. 发现所有的字都被加上了 <font> 标签,导致样式全部错乱

    经检查,发现我的浏览器默认打开了翻译软件!!!!!!!

  9. 调用线程必须为 STA,因为许多 UI 组件都需要

    WPF中,代码中准备控制控件内容时,有时会报错: 调用线程必须为 STA,因为许多 UI 组件都需要 我知道,在winform下面,使用多线程时,控件的值读取是可以的,但如果要更改,那么就必须进行一些 ...

  10. rel='canonical'

    rel='canonical' <!DOCTYPE html><html><head> <meta charset="utf-8"/> ...