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

Author

Ignatius.L

思路:

看见图就知道是搜索。。。。。

一开始想用DFS因为DFS好写,但因为需要求最短路径,DFS不好处理,所以直接用BFS

唯一难一点的地方就是如何记录路径

因为当一个点第一次被BFS时的路径一定是到起点的最短路径,因此只需记录下此节点的前驱,最后打印时由终点回溯即可

当然,也可以从终点开始搜索,打印路径时方便一些

lrj的算法竞赛入门经典也有类似篇幅介绍BFS记录路径

代码:

//HDU 1026
//光搜 + 优先队列,需要记录路径
#include<stdio.h>
#include<queue>
#include<iostream>
#include<string.h>
using namespace std;
const int MAXN = 110;
struct node
{
int x, y;
int time;
friend bool operator<(node a, node b) //time小的优先级高
{
return a.time > b.time;
}
};
priority_queue<node>que; //优先队列
struct cmap
{
int nx, ny; //记录前驱,用来记录路径
char c;
} map[MAXN][MAXN]; //记录map
int n, m;
int fight[MAXN][MAXN], mark[MAXN][MAXN];
int bfs()//从目标点开始搜索,搜索到起点。记录搜索的前驱,就记录下路径了
{
int k;
int dir[4][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}};
node now, next;
while (!que.empty()) que.pop();//初始化
now.x = n - 1; now.y = m - 1;
if (map[now.x][now.y].c >= '1' && map[now.x][now.y].c <= '9')
{
now.time = map[n - 1][m - 1].c - '0';
fight[now.x][now.y] = map[now.x][now.y].c - '0';
}
else now.time = 0; que.push(now);
while (!que.empty())
{
now = que.top();
que.pop();
if (now.x == 0 && now.y == 0) return now.time;
for (k = 0; k < 4; k++)
{
next.x = now.x + dir[k][0];
next.y = now.y + dir[k][1];
if (next.x >= 0 && next.x < n && next.y >= 0 && next.y < m &&
!mark[next.x][next.y] && map[next.x][next.y].c != 'X')
{
if (map[next.x][next.y].c >= '1' && map[next.x][next.y].c <= '9')
{
next.time = now.time + map[next.x][next.y].c - '0' + 1;
fight[next.x][next.y] = map[next.x][next.y].c - '0'; }
else next.time = now.time + 1;
que.push(next);
map[next.x][next.y].nx = now.x;
map[next.x][next.y].ny = now.y;
mark[next.x][next.y] = 1;
}
}
}
return -1;
}
int main()
{
int i, j, flag, x, y, tx, ty, sec;
while (scanf("%d%d", &n, &m) != EOF)
{
for (i = 0; i < n; i++)
for (j = 0; j < m; j++)
{
scanf(" %c", &map[i][j].c); //前面一个空格很关键
mark[i][j] = fight[i][j] = 0;
}
mark[n - 1][m - 1] = 1;
flag = bfs();
if (flag != -1)
{
printf("It takes %d seconds to reach the target position, let me show you the way.\n", flag);
sec = 1, x = y = 0;
while (sec != flag + 1)
{
printf("%ds:(%d,%d)->(%d,%d)\n", sec++, x, y, map[x][y].nx, map[x][y].ny);
for (i = 0; i < fight[map[x][y].nx][map[x][y].ny]; i++)
printf("%ds:FIGHT AT (%d,%d)\n", sec++, map[x][y].nx, map[x][y].ny);
tx = map[x][y].nx;
ty = map[x][y].ny;
x = tx; y = ty;
} }
else
printf("God please help our poor hero.\n");
printf("FINISH\n"); }
return 0;
}

HDU1026--Ignatius and the Princess I(BFS记录路径)的更多相关文章

  1. hdu 1026 Ignatius and the Princess I (bfs+记录路径)(priority_queue)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1026 Problem Description The Princess has been abducted ...

  2. 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 ...

  3. hdu---------(1026)Ignatius and the Princess I(bfs+dfs)

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

  4. hdu1026.Ignatius and the Princess I(bfs + 优先队列)

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

  5. POJ.3894 迷宫问题 (BFS+记录路径)

    POJ.3894 迷宫问题 (BFS+记录路径) 题意分析 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, ...

  6. Codeforces-A. Shortest path of the king(简单bfs记录路径)

    A. Shortest path of the king time limit per test 1 second memory limit per test 64 megabytes input s ...

  7. HDU1026 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. HDU-1026 Ignatius and the Princess I(BFS) 带路径的广搜

      此题需要时间更少,控制时间很要,这个题目要多多看, Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others)    Me ...

  9. hdu 1026 Ignatius and the Princess I(优先队列+bfs+记录路径)

    以前写的题了,现在想整理一下,就挂出来了. 题意比较明确,给一张n*m的地图,从左上角(0, 0)走到右下角(n-1, m-1). 'X'为墙,'.'为路,数字为怪物.墙不能走,路花1s经过,怪物需要 ...

随机推荐

  1. ORACLE 使用通配符进行字符串截取

    ORACLE 使用通配符进行字符串截取 select regexp_substr('aa--a(1-23),b---b(32---1)','[^(,)]+',1,1) as col1, regexp_ ...

  2. 【校内test】桶哥的问题

    (以上题目出自_rqy两年前) #A:桶哥的问题——买桶[链接] [题目描述] 桶哥要买一些全家桶.他有a元钱,而每个桶要花b元钱.他能不能买到c个桶? [输入格式] 一行三个整数a, b, c [输 ...

  3. homestead安装swoole扩展

    配置好ubuntu的国内镜像源并更新 查看php版本,并安装对应php版本的dev sudo apt install php7.2-dev 配置pecl sudo pecl channel-updat ...

  4. Appium+Python之获取toast

    思考:手机APP上的必填或错误文本提示一般1-2s就会消失,比较难定位,所以一般的固定元素定位方式是不可用的,那我们如何定位toast呢? 前提:1.Appium1.6.3以上(包括1.6.3) 2. ...

  5. python子进程模块subprocess详解

    subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...

  6. Linux下安装升级python

    本文主要是参考帖子,感谢这位博主,我主要是对相关操作进行补充和说明. 本文主要是在linux(centos)下安装Python3.7.1 1.下载安装Python-3.7.1 1) 下载Python- ...

  7. ARM系统时钟初始化

    2440时钟体系,12MHz的晶振 6410时钟体系,12MHz的晶振 210时钟体系,24MHz晶振 时钟初始化:1.设置locktime 2.设置分频系数 4.设置CPU到异步工作模式 3.设置f ...

  8. GlobalLock锁定一个全局内存对象

    GlobalLock BAIPro

  9. linux宏

    INT_MAX UINT_MAX ATTRIBUTE_UNUSED

  10. Jmeter启动jmeter-server.bat 报java.io.FileNotFoundException:rmi_keystore.jks 解决方法

    解决方法:1.找到apache-jmeter-5.0\bin\jmeter.properties 2.修改server.rmi.ssl.disable=true (记得去除server.rmi.ssl ...