题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1026
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
网上说用stack输出路径
可是stack还不会用,参照了大神的思路,只要倒着搜索就可以不用栈了,用二维数组记录每一步的前驱再往回打印就可以输出路径了;
本题用到了优先队列,时间小的先出队,对优先队列有疑惑的同学请移步 :STL优先队列详解
【源代码】
#include <stdio.h>
#include <cstring>
#include <queue>
using namespace std;
#define maxn 110
char map[110][110];
bool vis[maxn][maxn];
struct point
{
int x,y;int times;
friend bool operator <(point a,point b)
{
return a.times>b.times; //重载小于号,使得时间小的先出队列;
}
};
struct Pre{
int px,py;
}pre[maxn][maxn];
int r,c;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool inborder(point a)
{
if(a.x<0||a.y<0||a.x>r-1||a.y>c-1)
return false;
return true;
}
void BFS(int x, int y)
{
pre[x][y].px=-1;
vis[x][y]=1;
point st;
st.x=x,st.y=y;
if(map[st.x][st.y]!='.')
st.times=(map[st.x][st.y]-'0');
else
st.times=0;
priority_queue<point>Q;
while(!Q.empty())
Q.pop();
Q.push(st);
while(!Q.empty())
{
point now=Q.top();
Q.pop();
if(now.x==0&&now.y==0)
{
int key=1;
printf("It takes %d seconds to reach the target position, let me show you the way.\n",now.times);
while(pre[now.x][now.y].px!=-1)//循环找前驱,直到终点
{
int tx=pre[now.x][now.y].px;
int ty=pre[now.x][now.y].py;
if(map[tx][ty]=='.')
{
printf("%ds:(%d,%d)->(%d,%d)\n",key++,now.x,now.y,tx,ty);
}
else//打怪耗时
{
printf("%ds:(%d,%d)->(%d,%d)\n",key++,now.x,now.y,tx,ty);
int tt=map[tx][ty]-'0';
while(tt--)
printf("%ds:FIGHT AT (%d,%d)\n",key++,tx,ty);
}
now.x=tx;//将当前前驱作为起始
now.y=ty;
}
//printf("%ds:(%d,%d)->(%d,%d)\n",key++,now.x,now.y,r-1,c-1);
return ;
}
else
{
point next;
for(int i=0;i<4;i++)
{
next.x=now.x+dx[i];
next.y=now.y+dy[i];
next.times=now.times;
if(map[next.x][next.y]=='X'||vis[next.x][next.y]||!inborder(next))
continue;
else
{
vis[next.x][next.y]=1;
if(map[next.x][next.y]=='.')
{
next.times+=1;
}
else
{
next.times+=(map[next.x][next.y]-'0'+1);//除了打怪耗时,还有走到该坐标的耗时故+1;
}
pre[next.x][next.y].px=now.x;//记录前驱
pre[next.x][next.y].py=now.y;
Q.push(next);
}
}
}
}
printf("God please help our poor hero.\n");
}
void init()
{
memset(vis,0,sizeof(vis));
memset(map,'\0',sizeof(map));
memset(pre,0,sizeof(pre));
}
int main()
{
//int r,c;
while(~scanf("%d%d",&r,&c))
{
init();
for(int i=0;i<r;i++)
scanf("%s",map[i]);
BFS(r-1,c-1);//从右下角搜索
puts("FINISH");
}
return 0;
}hdu1026 Ignatius and the Princess I(BFS+优先队列)
原文:http://blog.csdn.net/chaiwenjun000/article/details/45457541