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 (Java/Others) Total Submission(s): 9910 Accepted Submission(s): 2959 Special Judge
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.
1s:(0,0)->(1,0)
It takes 14 seconds to reach the target position, let me show you the way.
1
God please help our poor hero.
#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) 带路径的广搜的更多相关文章
- 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 ...
- 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 ...
- HDU 1026 Ignatius and the Princess I(带路径的BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:给出一个迷宫,求出到终点的最短时间路径. 这道题目在迷宫上有怪物,不同HP的怪物会损耗不同的时间,这 ...
- 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 ...
- 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 ...
- hdu 1026 Ignatius and the Princess I
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1026 Ignatius and the Princess I Description The Prin ...
- 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 ...
- HDU 1026 Ignatius and the Princess I(BFS+优先队列)
Ignatius and the Princess I Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d &am ...
- 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 ...
- 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 ...
随机推荐
- unix 常用命令
(一)基本命令 命令格式: 命令 参数 1.ls 显示文件名,等同于dos下dir命令 命令格式:ls [option] file option: -l 显示详细列表 域1 :文件类型和文件权限 域2 ...
- Centos 添加SWAP(交换分区)
一般情况下,内存过小时,可以增加 swap,大小为内存的2倍为宜,具体设置如下: 1.进入目录cd /var/ 2.获取要增加的SWAP文件块(这里以1GB为例)dd if=/dev/zero of= ...
- PYTHON代码摘录
文件处理 #典型的读取文件代码 row_data = {} with open('PaceData.csv') as paces: column_heading = paces.readline(). ...
- LNMP下防跨站、跨目录安全设置,仅支持PHP 5.3.3以上版本
PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入: [HOST=www.vpser.net] open_basedir=/home/wwwroot ...
- SQL日期(转)
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割 (年.月.日等),然后仅仅用分割出来的年.月.日等放在几个 ...
- 初识Tower Defense Toolkit
Tower Defense Toolkit 做塔防游戏的插件 主要层次如下图: 1GameControl _ _Game Control(Script) _ _ _Spawn Manager _ _ ...
- DB天气app冲刺第三天
昨天很郁闷而且烦躁的的过了一天 什么也没弄.今天其实也没有怎么做..进度非常慢.. 因为个人的问题 所以这两天的效率非常慢. 但今天还是做了一些东西.把listview做出来了.做出了一个按钮的效果. ...
- VC项目配置基础以及快捷键(收藏)
来自http://blog.csdn.net/phunxm/article/details/5082488 一.IDE基础配置 1.字体 VC6中“Tools→Options→Format→Font” ...
- Tomcat 性能调优 出现java.lang.OutOfMemoryError: PermGen space
Tomcat 在部署应用中,Server报错:java.lang.OutOfMemoryError: PermGen space,问题就是Tomcat内存分配的太小了. 解决办法 1: 修改Tomca ...
- 理解sparse coding
理解sparse coding 稀疏编码系列: (一)----Spatial Pyramid 小结 (二)----图像的稀疏表示——ScSPM和LLC的总结 (三)----理解sparse codin ...