【POJ2251】Dungeon Master(三维BFS)

题面:【POJ2251】Dungeon Master

这是一道很有意思的题目,平时我们所接触的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;
}



版权声明:转载请注明地址

猜你喜欢

转载自blog.csdn.net/chenxiaoran666/article/details/79939963
今日推荐