bfs
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string>
#include<queue>
#include<vector>
#include<map>
using namespace std;
const int inf=100000000;
char s[110][110];
int n,m,dx[]={-1,1,0,0},dy[]={0,0,-1,1};
struct Point{
int prx,pry,sec,x,y;
Point(){
sec=inf;
}
};
void bfs(){
int i,add,ansx[10010],ansy[10010],k,j;
// printf("%d\n",pp.sec);
Point p[110][110],pp;
pp.x=pp.y=pp.sec=0;
queue<Point> q;
q.push(pp);
while(!q.empty()){
pp=q.front();
q.pop();
for(i=0;i<4;i++){
int nx=pp.x+dx[i],ny=pp.y+dy[i];
if(nx<n&&nx>=0&&ny<m&&ny>=0&&s[nx][ny]!='X'){
if(s[nx][ny]=='.')
add=1;
else
add=s[nx][ny]-'0'+1;
if(pp.sec+add<p[nx][ny].sec){
p[nx][ny].prx=pp.x;
p[nx][ny].pry=pp.y;
p[nx][ny].x=nx;
p[nx][ny].y=ny;
p[nx][ny].sec=pp.sec+add;
q.push(p[nx][ny]);
}
}
}
}
if(p[n-1][m-1].sec==inf)
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",p[n-1][m-1].sec);
int sx=n-1,sy=m-1;
k=0;
while(1){
ansx[k]=sx;
ansy[k++]=sy;
if(sx==0&&sy==0)
break;
int tx=sx,ty=sy;
sx=p[tx][ty].prx;
sy=p[tx][ty].pry;
}
for(i=k-1,j=0;i>0;i--){
if(s[ansx[i]][ansy[i]]!='.'){
int t=s[ansx[i]][ansy[i]]-'0';
while(t--)
printf("%ds:FIGHT AT (%d,%d)\n",++j,ansx[i],ansy[i]);
printf("%ds:(%d,%d)->(%d,%d)\n",++j,ansx[i],ansy[i],ansx[i-1],ansy[i-1]);
}
else
printf("%ds:(%d,%d)->(%d,%d)\n",++j,ansx[i],ansy[i],ansx[i-1],ansy[i-1]);
}
if(s[n-1][m-1]!='.')
{
int t=s[n-1][m-1]-'0';
while(t--)
printf("%ds:FIGHT AT (%d,%d)\n",++j,n-1,m-1);
}
}
printf("FINISH\n");
}
int main()
{
int i;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=0;i<n;i++)
scanf("%s",s[i]);
bfs();
}
return 0;
}

本文介绍了一个使用广度优先搜索(BFS)算法解决迷宫寻路问题的C++实现。该程序通过定义迷宫地图并计算从起点到终点的最短路径,同时考虑了路径上的战斗消耗时间。代码中详细展示了如何利用队列进行节点扩展,以及如何回溯路径来显示完整的行走路线。
7万+

被折叠的 条评论
为什么被折叠?



