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. something interesting when read docs

    When you kill a session with "ALTER SYSTEM KILL SESSION  '' ". If the session is performin ...

  2. Android获取全部存储卡挂载路径

    近期因项目需求.须要在存储卡查找文件,经測试发现部分手机挂载路径查找不到,这里分享一个有效的方法. /** * 获取全部存储卡挂载路径 * @return */ public static List& ...

  3. 避免死锁的银行家算法C++程序实现

     本篇博文为追忆以前写过的算法系列第二篇(20081021) 温故知新 目的:具有代表性的死锁避免算法是Dijskstra给出的银行家算法.本实验是基于银行家算法的思想通过编写C++程序实现银行家 ...

  4. install yael on the ubuntu 12.04

    1. bits/predefs.h no such file or directory  ??? sudo apt-get install gcc-multilib 2. sudo gedit /et ...

  5. C++链表冒泡,归并,插入排序(纯指针)

    #include <iostream> using namespace std; //别问我为什么要写链表的冒泡排序. struct Node { int data; Node *next ...

  6. [Codeforces 489E] Nastya and King-Shamans

    [题目链接] http://codeforces.com/contest/992/problem/E [算法] 线段树 + 二分 时间复杂度 : O(NlogN^2) [代码] #include< ...

  7. Antenna Placement(二分图的最大匹配)

    http://poj.org/problem?id=3020 题意: 一个矩形中,有N个城市'*',现在这n个城市都要覆盖无线,若放置一个基站,它至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使 ...

  8. nodejs在windows下的安装

    Windowv 上安装Node.js Windows 安装包(.msi) : 32 位安装包下载地址 : http://nodejs.org/dist/v0.10.26/node-v0.10.26-x ...

  9. 关于C++ const 变量

    const 的全局变量是储存在一个只读数据段中,虽然你可以定义一个指向它的指针,却会在运行时,在对该地址赋值的时候发生运行错误,而局部的const变量是储存在栈中的,离开作用域后同样会被释放,并且可以 ...

  10. flask 中的模板语法 jinja2及render_template的深度用法

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...