http://poj.org/problem?id=2251
一道简单的BFS,只不过是二维数组,变三维数组,也就在原来基础上加了两个方向。
题意就是从S走到E,#不能走。
#include <stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
using namespace std; #define judge(x,y,z) mark[x][y][z]&&str1[x][y][z]!='#'&&x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c //判断这个点是否可以走。
char str1[][][];
int l,r,c,sx,sy,sz,ex,ey,ez,step[][][];
int dic[][]{,,,,,-,,,,-,,,,,,,-,}; //方向。 struct note{
int x,y,z;
};
bool mark[][][];
queue<note>s; //定义了一个s的结构体队列。因为一个点要通过三个值来确定,所以这里选择用结构体是比较方便的。 void bfs(int x,int y,int z)
{
note u;
u.x=x,u.y=y,u.z=z;
while(!s.empty())
s.pop();
s.push(u);
while(!s.empty())
{
note v;
v=s.front();
s.pop();
if(v.x==ex&&v.y==ey&&v.z==ez) return;
for(int i=;i<;i++)
{
u.x=v.x+dic[i][];
u.y=v.y+dic[i][];
u.z=v.z+dic[i][];
if(judge(u.x,u.y,u.z)){
step[u.x][u.y][u.z]=step[v.x][v.y][v.z]+;
mark[u.x][u.y][u.z]=false;
s.push(u);
}
}
}
} int main()
{
while(scanf("%d%d%d",&l,&r,&c),l!=&&r!=&&c!=)
{
memset(mark,true,sizeof(mark));
memset(str1,,sizeof(str1));
memset(step,,sizeof(step));
for(int i=;i<l;i++)
for(int j=;j<r;j++)
{
scanf("%s",str1[i][j]);
for(int k=;k<c;k++)
{
if(str1[i][j][k]=='S')
{
sx=i;
sy=j;
sz=k;
}
if(str1[i][j][k]=='E')
{
ex=i;
ey=j;
ez=k;
}
}
}
step[sx][sy][sz]=;
bfs(sx,sy,sz);
if(step[ex][ey][ez]==) printf("Trapped!\n"); //如果走不到那个点,那么那个点的步数肯定是为0的,通过这个条件来判断是否可以找到那一个出口。
else printf("Escaped in %d minute(s).\n",step[ex][ey][ez]);
}
}