hdu(1026)Ignatius and the Princess I(BFS + 最短路)

用优先队列确定最短时间,并用数组 记录路线。。

BFS:
如果能找到路径, 要输出最短时间内的路径信息.为了方便输出路径, 从终点开始BFS, 搜索最短的路径,
每个位置元素中, 记录前一个位置的信息, 则能输出从起点(0, 0) 到 (终点)的最短路径.

最短路径:
从 out 往周围搜索其他位置时, 当搜到一点 in;此时就判断:(0, 0) -> cur -> next
这样加入位置 cur 后是否会缩短 (0, 0) -> next 的距离.

          


#include
#include
#include
using namespace std;
int dir[4][2]={-1,0,  1,0,  0,1,   0,-1};
char map[200][200];
int visit[200][200];
int flag[200][200];//为了方面计算上一个位置。。
int blood[200][200];//记录打怪兽的时间
int n,m,k;
struct point
{
int x,y,time;
friend bool operator<(point a,point b)
{
return a.time>b.time;
}
};
int judge(int x,int y)
{
if(x<0||y<0||x>=n||y>=m)
return 0;
if(map[x][y]=='X'||visit[x][y])
return 0;
return 1;
}
int bfs(int x0,int y0)
{
int i;
point in,out;
priority_queueq;
in.x=x0;
in.y=y0;
in.time=0;
q.push(in);
while(!q.empty())
{
out=q.top();
q.pop();
if(out.x==n-1&&out.y==m-1)
{
 
return out.time;
}
for(i=0;i<4;i++)
{
in.x =out.x+dir[i][0];
in.y=out.y+dir[i][1];
if(judge(in.x,in.y)==0)
continue;
in.time=out.time+1;
if(map[in.x][in.y]!='.')
{
    in.time+=map[in.x][in.y]-'0';
    blood[in.x][in.y]=map[in.x][in.y]-'0';////记录打怪兽的时间
}
flag[in.x][in.y]=i+1;
visit[in.x][in.y]=1;
q.push(in);
}
}
return 0;
}
void P(int x,int y)//搜索的时候从后到前,输出从前到后,正好。。打表。。
{
    int x1,y1;
    if(flag[x][y]==0)
        return;
    x1=x-dir[flag[x][y]-1][0];
    y1=y-dir[flag[x][y]-1][1];
    P(x1,y1);
    printf("%ds:(%d,%d)->(%d,%d)\n",k++,x1,y1,x,y);
    while(blood[x][y]--)   
        printf("%ds:FIGHT AT (%d,%d)\n",k++,x,y);
}
int main()
{
  int i,h;
  while(scanf("%d%d",&n,&m)!=EOF)
  {
    for(i=0;i          scanf("%s",map[i]);
          memset(visit,0,sizeof(visit));
          memset(flag,0,sizeof(flag));
          memset(blood,0,sizeof(blood));
           visit[0][0]=1;
           h=bfs(0,0);
                if(h==0)
               printf("God please help our poor hero.\n");
                else
                {
                    printf("It takes %d seconds to reach the target position, let me show you the way.\n",h);

                    k=1;
                    P(n-1,m-1);//从后到前。。
                }     
    printf("FINISH\n");
  }
return 0;
}

 

你可能感兴趣的:(优先队列)