前面我们已经介绍了BFS的一维的二维的,现在我们来介绍一下BFS在三维空间中的用法。
其实三维空间感觉也不是太难,就是感觉个人的立体感不是太强,而且平常也基本上没有做过三维空间的题,所以才会感觉比较难,其实还好吧。
三维空间和二维空间还有一维空间的思路都是一模一样的,只不过每个点的扩展稍微多了一点,最多就是有8个点吧,
现在我们给一个最基本的题来简单的了解一下三维中BFS的用法。
[NWUACM]
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?Input - 输入
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度。
R和C分别表示每层空间的行与列的大小。
随后L层地牢,每层R行,每行C个字符。
每个字符表示空间的一个单元。'#'表示不可通过单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
每层空间后都有一个空行。L,R和C均为0时输入结束。Output - 输出
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!Sample Input - 输入样例
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0Sample Output - 输出样例
Escaped in 11 minute(s). Trapped!
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char ch[40][40][40];
int b[40][40][40];
int x,y,z;
int edx,edy,edz,enx,eny,enz;
struct stu
{
int x;
int y;
int z;
int t;
}A,B;
int p(int i,int j,int k)
{
if(i>=0&&i<x&&j>=0&&j<y&&k>=0&&k<z&&b[i][j][k]==0&&ch[i][j][k]!='#')
return 1;
else return 0;
}
void bfs(int x1,int y1,int z1)
{
queue<stu> que;
A.x=x1;A.y=y1;A.z=z1;
A.t=0;
que.push(A);
b[x1][y1][z1]=1;
int cnt=-1;
while(!que.empty())
{
A=que.front();
que.pop();
if(A.x==enx&&A.y==eny&&A.z==enz)
{
cnt=A.t;
break;
}
for(int i=0;i<6;i++)
{
if(i==0)
{
B.x=A.x+1;
B.y=A.y;
B.z=A.z;
}
else if(i==1)
{
B.x=A.x-1;
B.y=A.y;
B.z=A.z;
}
else if(i==2)
{
B.x=A.x;
B.y=A.y+1;
B.z=A.z;
}
else if(i==3)
{
B.x=A.x;
B.y=A.y-1;
B.z=A.z;
}
else if(i==4)
{
B.x=A.x;
B.y=A.y;
B.z=A.z+1;
}
else
{
B.x=A.x;
B.y=A.y;
B.z=A.z-1;
}
if(p(B.x,B.y,B.z))
{
B.t=A.t+1;
b[B.x][B.y][B.z]=1;
que.push(B);
}
}
}
if(cnt==-1) printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n",cnt);
}
int main()
{
while(~scanf("%d %d %d",&x,&y,&z))
{
if(x==0&&y==0&&z==0)
break;
memset(b,0,sizeof(b));
for(int i=0;i<x;i++)
for(int j=0;j<y;j++)
scanf("%s",ch[i][j]);
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
for(int k=0;k<z;k++)
{
if(ch[i][j][k]=='S')
{
edx=i;edy=j;edz=k;
}
if(ch[i][j][k]=='E')
{
enx=i;eny=j;enz=k;
}
}
}
}
bfs(edx,edy,edz);
}
return 0;
}