标签:bfs
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
/* 起点(0,0) 终点(n-1,m-1), 'x'代表不能走, '.'可以走,走过来需耗费一秒, 数字代表可以走,不过走过来一秒还需要加上这个数字 优先队列,对于记录路径开一个path数组记录这一个点是从哪一个方向走来的就可以了,然后递归输出路径 */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; #define fre(i,a,b) for(i = a; i <b; i++) #define free(i,b,a) for(i = b; i >= a;i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define ssf(n) scanf("%s", n) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define bug pf("Hi\n") using namespace std; #define N 105 struct stud{ stud(int xx,int yy,int s):x(xx),y(yy),step(s){}; stud(){}; int x,y,step; bool operator<(const stud b) const { return step>b.step; } }; int n,m; priority_queue<stud>q; int path[N][N]; int vis[N][N]; int step[4][2]={1,0,-1,0,0,1,0,-1}; int all; char c[N][N]; bool judge(int x,int y) { if(x>=0&&x<n&&y>=0&&y<m) return true; return false; } void show(int x,int y) { if(x==0&&y==0) return ; int xx=x-step[path[x][y]][0]; int yy=y-step[path[x][y]][1]; show(xx,yy); printf("%ds:(%d,%d)->(%d,%d)\n",++all,xx,yy,x,y); if(c[x][y]>='0'&&c[x][y]<='9') { int i=c[x][y]-'0'; while(i--) printf("%ds:FIGHT AT (%d,%d)\n",++all,x,y); } } bool bfs() { int i,j; stud cur,next; while(!q.empty()) q.pop(); mem(vis,0); vis[0][0]=1; cur.x=0; cur.y=0; cur.step=0; q.push(cur); while(!q.empty()) { cur=q.top(); q.pop(); if(cur.x==n-1&&cur.y==m-1) { printf("It takes %d seconds to reach the target position, let me show you the way.\n",cur.step); all=0; show(n-1,m-1); return true; } for(i=0;i<4;i++) { int xx=cur.x+step[i][0]; int yy=cur.y+step[i][1]; if(!judge(xx,yy)) continue; if(vis[xx][yy]) continue; if(c[xx][yy]=='X') continue; next.x=xx; next.y=yy; next.step=cur.step+1; if(c[xx][yy]>='0'&&c[xx][yy]<='9') next.step+=c[xx][yy]-'0'; q.push(next); vis[xx][yy]=cur.step+1; path[xx][yy]=i; } } return false; } int main() { int i,j; while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;i++) scanf("%s",c[i]); if(!bfs()) printf("God please help our poor hero.\n"); printf("FINISH\n"); } return 0; } /* */
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1026 Ignatius and the Princess I(bfs +记录路径)
标签:bfs
原文地址:http://blog.csdn.net/u014737310/article/details/46763149