/*
三维迷宫问题,广度优先搜索
使用三维数组step来记录每一点最少的步数即可
或者使用队列记录也可以。
题意:从S到E,最短路径
*/
#include <cstdio>
#include <cstring>
int l,r,c,
sl,sr,sc,
el,er,ec;
const int nMax=35;
char dungeon[nMax][nMax][nMax];
int step[nMax][nMax][nMax];
struct node
{
int l,r,c;
node(){};
node(int l,int r,int c):l(l),r(r),c(c){}
}queue[nMax*nMax*nMax];
//runtime error,原因是开的数组不够大,原来误写成了queue[3*nMax]
int front,rear;
int dir[6][3]={{-1,0,0},{1,0,0},{0,0,-1},{0,0,1},{0,-1,0},{0,1,0}};
bool bfs()
{
bool ok=false;
queue[front++]=node(sl,sr,sc);
while(rear!=front && !ok)
{
node a=queue[rear++];
for(int i=0;i<6;i++)
{
int ii,jj,kk;
ii=a.l+dir[i][0];
jj=a.r+dir[i][1];
kk=a.c+dir[i][2];
if(dungeon[ii][jj][kk]=='.')
{
dungeon[ii][jj][kk]='#';
queue[front++]=node(ii,jj,kk);
step[ii][jj][kk]=step[a.l][a.r][a.c]+1;
}
else if(dungeon[ii][jj][kk]=='E')
{
step[ii][jj][kk]=step[a.l][a.r][a.c]+1;
ok=true;
break;
//WA原因,没注意到外面还有一个while()循环
}
}
}
return ok;
}
int main()
{
//freopen("data.in","r",stdin);
while(scanf("%d %d %d\n",&l,&r,&c)==3)
{
if(l==0 && r==0 && c==0)
break;
memset(dungeon,0,sizeof(dungeon));
memset(step,0,sizeof(step));
front=rear=0;
for(int i=1;i<=l;i++)
{
for(int j=1;j<=r;j++)
{
for(int k=1;k<=c;k++)
{
dungeon[i][j][k]=getchar();
if(dungeon[i][j][k]=='S')
{
sl=i;
sr=j;
sc=k;
}
else if(dungeon[i][j][k]=='E')
{
el=i;
er=j;
ec=k;
}
}
getchar();
}
getchar();
}
if(bfs())
printf("Escaped in %d minute(s).\n",step[el][er][ec]);
else
printf("Trapped!\n");
}
return 0;
}
532 - Dungeon Master(***)
最新推荐文章于 2021-03-13 12:36:09 发布