此题需要时间更少,控制时间很要,这个题目要多多看,

Ignatius and the Princess I

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9910    Accepted Submission(s): 2959 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)
1
4s:FIGHT AT (4,5)
FINISH
God please help our poor hero.
FINISH
 
Author
Ignatius.L
    #include <stdio.h>
#define MAX_ 100000;
char map[][];
typedef struct {
int x ,y ,time ,front;
}point;
int dir[][] = {-,,,,,,,-},mintime[][];
int n , m ,I ,J;
point arr[];
void bfs ()
{
while (I != J)//队列不为空
{
point head = arr[I++];
for (int i = ;i <= ;i++)
{
int x = head.x + dir[i][] ,y = head.y + dir[i][];
if (x >= && y >= && x < m && y < n && map[x][y] != 'X')
{
point k;
//k.x = x ,k.y = y;
k.time = head.time + ;
if (map[x][y] != '.')
k.time += map[x][y] - '';
if(k.time < mintime[x][y])//若到达minttime【x】【y】时间小于其他点到此点时间,此点入队
{
mintime[x][y] = k.time;
k.x = x ,k.y = y;
k.front = I - ;
//printf("%d---%d---%d---%d\n",k.x ,k.y ,k.time ,k.front);
arr[J++] = k;
}
} }
}
}
int main()
{
while (scanf("%d %d",&m,&n) != EOF)
{
for (int i = ;i < m ;i++)
for (int j = ;j < n ;j++)
{
scanf(" %c",&map[i][j]);
mintime[i][j] = MAX_;
}
//队列第一个元素赋值
arr[].x = m - ,arr[].y = n - ,arr[].time = ,arr[].front = - ,mintime[m-][n-] = ;
if (map[m-][n-] != 'X' && map[m-][n-] != '.') mintime[m - ][n - ] = arr[].time = map[m-][n-] - '';
I = ,J = ;
int time = ;
//执行搜索
bfs ();
//不能到达
if (mintime[][] == )
printf ("God please help our poor hero.\n");
else
{
printf ("It takes %d seconds to reach the target position, let me show you the way.\n",mintime[][]);
point s = arr[I-];
while (s.x != || s.y !=)
s = arr[--I];
int p ,time = ,x ,y;
//打印路径
while (s.front >= )
{
p = s.front;
x = arr[p].x ,y = arr[p].y;
printf ("%ds:(%d,%d)->(%d,%d)\n",time++,s.x,s.y,x,y);
if (map[x][y] != 'X' && map[x][y] != '.')
for(int i = ;i <= map[x][y]-'';i++)
printf("%ds:FIGHT AT (%d,%d)\n",time++,x,y);
s = arr[p];
}
}
printf ("FINISH\n");
}
return ;
}
方法2:
#include <stdio.h>
#define MAX_ 100000;
char map[][];
typedef struct {
int x ,y ,time ,front;
}point;
int dir[][] = {-,,,,,,,-},mintime[][];
int n , m ,I ,J;
point arr[];
void bfs ()
{
while (I != J)//队列不为空
{
point head = arr[I++];
for (int i = ;i <= ;i++)
{
int x = head.x + dir[i][] ,y = head.y + dir[i][];
if (x >= && y >= && x < m && y < n && map[x][y] != 'X')
{
point k;
//k.x = x ,k.y = y;
k.time = head.time + ;
if (map[x][y] != '.')
k.time += map[x][y] - '';
if(k.time < mintime[x][y])//若到达minttime【x】【y】时间小于其他点到此点时间,此点入队
{
mintime[x][y] = k.time;
k.x = x ,k.y = y;
k.front = I - ;
//printf("%d---%d---%d---%d\n",k.x ,k.y ,k.time ,k.front);
arr[J++] = k;
}
} }
}
}
int main()
{
while (scanf("%d %d",&m,&n) != EOF)
{
for (int i = ;i < m ;i++)
for (int j = ;j < n ;j++)
{
scanf(" %c",&map[i][j]);
mintime[i][j] = MAX_;
}
//队列第一个元素赋值
arr[].x = m - ,arr[].y = n - ,arr[].time = ,arr[].front = - ,mintime[m-][n-] = ;
if (map[m-][n-] != 'X' && map[m-][n-] != '.') mintime[m - ][n - ] = arr[].time = map[m-][n-] - '';
I = ,J = ;
int time = ;
//执行搜索
bfs ();
//不能到达
if (mintime[][] == )
printf ("God please help our poor hero.\n");
else
{
printf ("It takes %d seconds to reach the target position, let me show you the way.\n",mintime[][]);
point s = arr[I-];
while (s.x != || s.y !=)
s = arr[--I];
int p ,time = ,x ,y;
//打印路径
while (s.front >= )
{
p = s.front;
x = arr[p].x ,y = arr[p].y;
printf ("%ds:(%d,%d)->(%d,%d)\n",time++,s.x,s.y,x,y);
if (map[x][y] != 'X' && map[x][y] != '.')
for(int i = ;i <= map[x][y]-'';i++)
printf("%ds:FIGHT AT (%d,%d)\n",time++,x,y);
s = arr[p];
}
}
printf ("FINISH\n");
}
return ;
}
 
 

HDU-1026 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)

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

  4. hdu 1026 Ignatius and the Princess I(BFS+优先队列)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1026 Ignatius and the Princess I Time Limit: 2000/100 ...

  5. hdu 1026 Ignatius and the Princess I 搜索,输出路径

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

  6. hdu 1026 Ignatius and the Princess I

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1026 Ignatius and the Princess I Description The Prin ...

  7. hdu 1026 Ignatius and the Princess I【优先队列+BFS】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1026 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  8. HDU 1026 Ignatius and the Princess I(BFS+优先队列)

    Ignatius and the Princess I Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &am ...

  9. hdu 1026:Ignatius and the Princess I(优先队列 + bfs广搜。ps:广搜AC,深搜超时,求助攻!)

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

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

随机推荐

  1. c#拖放

    AllowDrop DragEnter: if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Cop ...

  2. HTML5:基本使用

    单行文本输入框 type为text表示input元素为一个单行文本框,是input元素的默认表现形式.单行文本输入框支持下面的属性设置. A:设定元素大小 maxlength属性设定用户能够输入的字符 ...

  3. HTTP协议(4)

    HTTP  概括总结 方便以后使用.遗忘时有侧重点的去学习,方便查阅: 开始看到webservice 和restful 有些不理解 现在可以简单理解为 : webservice = http协议+XM ...

  4. PHP学习心得(九)——函数

    一个函数可由以下的语法来定义.任何有效的 PHP 代码都有可能出现在函数内部,甚至包括其它函数和类定义. 函数名和 PHP 中的其它标识符命名规则相同.有效的函数名以字母或下划线打头,后面跟字母,数字 ...

  5. Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群

    大纲一.前言二.环境准备三.Corosync 安装与配置四.Pacemaker 安装与配置五.DRBD 安装与配置六.MySQL 安装与配置七.crmsh 资源管理 推荐阅读: Linux 高可用(H ...

  6. 【Bean】 这才是bean,一直没仔细看

    EJB是Enterprise Java Bean的缩写,一个Bean扮演着应用程序素材的角色.它包含有一个functional interface,一个life-cycle interface,以及一 ...

  7. XSS传染基础——JavaScript中的opener、iframe

    最近研究XSS,根据etherDream大神的博客 延长XSS生命周期 写了一个子页面父页面相互修改的demo. 一. 子页面.父页面相互修改——window.opener.window.open 在 ...

  8. <三> jQuery 选择器

    jQuery 选择器选择需要应用效果的元素,jQuery 元素选择器和属性选择器允许您通过标签名.属性名或内容对 HTML 元素进行选择.选择器允许您对 HTML 元素组或单个元素进行操作. 元素选择 ...

  9. 换一换js

    (function(){ var tit = $("#changes"), con = $("#wday>ul"), page = con.length, ...

  10. Cloud Test 单页面即时监测功能上线!

    什么是即时监测? 即时监测,顾名思义是指输入 URL 后能够立即进行监测并展示结果,无需注册. 如下图,在输入框内输入需要监测的 URL,点击免费监测,即可展示网页监测结果: 图中我们可以看到页面各个 ...