用优先队列确定最短时间,并用数组 记录路线。。
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_queue
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
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;
}