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 +记录路径)
原文:http://blog.csdn.net/u014737310/article/details/46763149