这是一道很有意思的题目,平时我们所接触的BFS大多是二维的,可这题不一样,这题是一道三维BFS!!!
这题不需要多讲,直接上代码就可以了:
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#define N 30
#define M 30
#define K 30
using namespace std;
const int dx[7]={0,1,0,0,-1,0,0},dy[7]={0,0,1,0,0,-1,0},dz[7]={0,0,0,1,0,0,-1};//6个方向
int n,m,k,sx,sy,sz,ex,ey,ez,Tail;//n、m、k分别表示迷宫的高、长、宽,sx、sy、sz表示起点的坐标,ex、ey、ez表示终点的坐标,Tail表示BFS数组的长度
char ch[N+5][M+5][K+5];//迷宫
struct BFS{int x,y,z,v;} s[N*M*K+5];//s[]数组记录每个状态
int BFS(int pos)//三维BFS
{
if(pos>Tail) return -1;//无法到达则返回-1
if(s[pos].x==ex&&s[pos].y==ey&&s[pos].z==ez) return s[pos].v;//到达终点则返回最少需要的步数
for(int i=1;i<=6;i++)//枚举6个方向
{
int nx=s[pos].x+dx[i],ny=s[pos].y+dy[i],nz=s[pos].z+dz[i];//以这个方向行走后所得到的新的坐标
if(nx<1||nx>n||ny<1||ny>m||nz<1||nz>k||ch[nx][ny][nz]=='#' ) continue;//判断该坐标是否合法
ch[nx][ny][nz]='#';//将这个位置标记为无法行走(即岩石)
s[++Tail].x=nx,s[Tail].y=ny,s[Tail].z=nz,s[Tail].v=s[pos].v+1;//将新的状态加入s[]数组
}
return BFS(pos+1);//搜索下一个状态
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k)&&n&&m&&k)
{
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int l=1;l<=k;l++) {cin>>ch[i][j][l];if(ch[i][j][l]=='S') sx=i,sy=j,sz=l;if(ch[i][j][l]=='E') ex=i,ey=j,ez=l;}//读入,并获取起点和终点的位置
s[Tail=1].x=sx,s[1].y=sy,s[1].z=sz,s[1].v=0,ch[sx][sy][sz]='#';//将起点作为第一个状态加入s[]数组,并将起点标记为无法行走(即岩石)
int ans=BFS(1);//进行三维BFS
if(ans==-1) puts("Trapped!");//如果无法到达输出"Trapped!"
else printf("Escaped in %d minute(s).\n",ans);//否则按照题目中给出的格式输出ans
}
return 0;
}
版权声明:转载请注明地址

本文介绍了一道关于三维BFS的编程题——DungeonMaster。通过三维BFS算法解决了一个复杂的迷宫寻路问题,包括迷宫的读取、起点与终点的定位、路径搜索及状态更新等内容。
&spm=1001.2101.3001.5002&articleId=79939963&d=1&t=3&u=10a853354f8b403187de20707c1f328b)
414

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



