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): 15576 Accepted Submission(s): 4937
Special Judge
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.
labyrinth. The input is terminated by the end of file. More details in the Sample Input.
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.
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.
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
1.abduct:绑架,诱拐。使外展
2.假设结构体中有构造函数,用该结构体类型去定义变量时,必须用构造函数去初始化变量,否则编译通只是
3.代码:
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
using namespace std; struct node
{
int x,y,t;
node(int a,int b,int c):x(a),y(b),t(c) {}//构造函数
void Set(int a,int b,int c)//设置函数
{
x=a;
y=b;
t=c;
}
bool operator <(const node &a)const//让优先队列的优先级:t小的,优先级高
{
return a.t<t;
}
}; struct node1
{
int x,y;
}; int n,m;
char mat[105][105];
bool vis[105][105];
node1 matt[105][105];//记录父亲坐标
int dir[4][2]= {1,0,0,1,-1,0,0,-1};
bool flag; void bfs()
{
memset(vis,0,sizeof(vis));
priority_queue<node> Q;
node first=node(0,0,0);
Q.push(first);
vis[first.x][first.y]=1;
matt[0][0].x=0;
matt[0][0].y=0;
while(!Q.empty())
{
first=Q.top();
Q.pop();
if(first.x==n-1&&first.y==m-1)
{
flag=1;
printf("It takes %d seconds to reach the target position, let me show you the way.\n",first.t);
stack<node1> S;//把路径存储在栈里
node1 e;
e.x=n-1;
e.y=m-1;
S.push(e);
while(1)
{
e=S.top();
if(e.x==matt[e.x][e.y].x&&e.y==matt[e.x][e.y].y)
{
break;
}
node1 ee;
ee.x=matt[e.x][e.y].x;
ee.y=matt[e.x][e.y].y;
S.push(ee);
}
for(int i=1; i<=first.t; i++)//输出路径
{
printf("%ds:",i);
if(mat[S.top().x][S.top().y]!='.')
{
printf("FIGHT AT (%d,%d)\n",S.top().x,S.top().y);
mat[S.top().x][S.top().y]--;
if(mat[S.top().x][S.top().y]=='0')
{
mat[S.top().x][S.top().y]='.';
}
}
else
{
printf("(%d,%d)",S.top().x,S.top().y);
S.pop();
printf("->(%d,%d)\n",S.top().x,S.top().y);
} }
printf("FINISH\n");
break;
}
node next=node(0,0,0);
for(int i=0; i<4; i++)
{
int tx=first.x+dir[i][0];
int ty=first.y+dir[i][1];
if(tx>=n||tx<0||ty>=m||ty<0||vis[tx][ty]==1)
{
continue;
}
else if(mat[tx][ty]=='X')
{
continue;
}
else if(mat[tx][ty]=='.')
{
next.Set(tx,ty,first.t+1);
matt[tx][ty].x=first.x;
matt[tx][ty].y=first.y;
vis[tx][ty]=1;
Q.push(next);
}
else
{
next.Set(tx,ty,first.t+1+mat[tx][ty]-'0');
vis[tx][ty]=1;
matt[tx][ty].x=first.x;
matt[tx][ty].y=first.y;
Q.push(next);
} } }
if(!flag)
printf("God please help our poor hero.\nFINISH\n");
} int main()
{
while(scanf("%d%d",&n,&m)==2)
{
for(int i=0; i<n; i++)
{
scanf("%s",mat[i]);
}
flag=0;
bfs();
}
return 0;
}
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+优先队列)
传送门: 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(带路径的BFS)
http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:给出一个迷宫,求出到终点的最短时间路径. 这道题目在迷宫上有怪物,不同HP的怪物会损耗不同的时间,这 ...
- 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 ...
随机推荐
- 将Oracle中的数据放入elasticsearch
package com.c4c.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Res ...
- PE文件结构(三) 输入表
PE文件结构(三) 參考 书:<加密与解密> 视频:小甲鱼 解密系列 视频 输入表 输入函数,表示被程序调用可是它的代码不在程序代码中的,而在dll中的函数.对于这些函数.磁盘上的可执行文 ...
- bzoj1019: [SHOI2008]汉诺塔(动态规划)
1019: [SHOI2008]汉诺塔 题目:传送门 简要题意: 和经典的汉诺塔问题区别不大,但是题目规定了一个移动时的优先级: 如果当前要从A柱子移动,但是A到C的优先级比A到B的优先级大的话,那就 ...
- zzuoj--10401--物资调度(dfs)
A.物资调度 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 93 Solved: 52 [Submit][Status][Web Board] De ...
- JavaScript实现记住密码功能
用js实现记住密码功能,但是前端记住密码不安全,最好还是不要用.我感觉这个记住密码应该是通过与后台建立一个会话来实现. 这个效果的测试地址在:http://ofoyou.com/blog/rePass ...
- 计算sigma
1.计算平均值Avg Avg = (a0 + a1 + ......+ an-1) / n 2.计算sigma sigma = sqrt( ( (a0-avg) ^2 + (a1-avg) ^2 ...
- Java多线程编程模式实战指南(一):Active Object模式--转载
本文由黄文海首次发布在infoq中文站上:http://www.infoq.com/cn/articles/Java-multithreaded-programming-mode-active-obj ...
- Windows服务的创建,安装,卸载
我公司项目的产线系统要与WMS物流系统做借口对接,需要我创建一个windows服务的项目,里面含有7个服务 创建Windows服务: 1.如图:点击 windows->经典桌面->wind ...
- PHP正则表达式函数总结
/* 测试环境:PHP5.3.29(PCRE8.32) */ 常用函数:(正则表达式规则基本同JS_RE_Read.txt) PS:1.PHP中的PCRE一般仅使用这三个修饰符:"i&quo ...
- 蛋白质GO信息的一些数据库
最近用到蛋白质序列数据,但是才发现蛋白质的编号主要分为两种:一种是ENSP开头,主要是在ensembl数据库查询asia.ensembl.org/Human/Search:而另一种是uniprot.w ...