标签:acm hdu bfs 优先队列 stl
题目链接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+优先队列)
标签:acm hdu bfs 优先队列 stl
原文地址:http://blog.csdn.net/chaiwenjun000/article/details/45457541