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 ...
随机推荐
- 四则运算2(最终版)java+jps+sqlServer
1,设计思想 (1)在java Resources里建立包和类 (2)在类里面写入方法,其中包括生成算式create()和删除算式delete()用来更新数据库中的题目 (3)Show()方法用来随机 ...
- Springboot2本地锁实践
在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交…. 下面我们利用 ...
- Android 中模仿 Twitter 实现 Toolbar Indicator
项目地址:https://github.com/nekocode/ToolbarIndicator
- stl里面stack的注意事项
1. pop是不返回元素的.因为不能返回引用,只能返回实例.而这个实例是在函数里面初始化的,所以必须在外面再赋值和初始化.而如果实例复制失败,会产生丢失. 2. 而top是可以返回引用的.实际上,返回 ...
- MongoDB创建\更新\删除文档操作
一.插入\创建文档 --当插入一个不存在的文档时,会自己主动创建一个文档 [root@racdb ~]# mongo MongoDB shell version: 2.4.14 connecti ...
- 一起talk C栗子吧(第一百一十二回:C语言实例--线程同步概述)
各位看官们,大家好.上一回中咱们说的是线程间通信的样例,这一回咱们说的样例是:线程同步.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,提到同步.我想大家都不陌生,由于我们在前面章回中介绍 ...
- [React] Understanding setState in componentDidMount to Measure Elements Without Transient UI State
In this lesson we'll explore using setState to synchronously update in componentDidMount. This allow ...
- 随心所欲生成git仓库随意一段commit的专用patch应用小实践
随心所欲生成git仓库随意一段commit的专用patch应用小实践 我们在开发中.时不时的可能要去做一个patch给你的下线,或者你的合作者.在git管理中,我们知道有git format-pat ...
- POJ-1785-Binary Search Heap Construction(笛卡尔树)
Description Read the statement of problem G for the definitions concerning trees. In the following w ...
- nyoj--55--懒省事的小明(STL优先队列)
懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种类分 ...