http://poj.org/problem?id=2251
题目很简单,就是个三维迷宫题,用广搜可以解决。
在初始化迷宫图的时候在迷宫外围都加上一层 由 ' #' 组成的墙。
Memory:668K Time:16MS
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct Level
{
char maze[32][32];
}level[32];
struct Place
{
int pl,pr,pc;
int step;
}q[30000];
bool vis[32][32][32];
int sl,sr,sc,el,er,ec;
void BFS()
{
memset(vis,0,sizeof vis);
int ans;
int top=0,tail=1;
q[top].pl=sl;
q[top].pr=sr;
q[top].pc=sc;
q[top].step=0;
vis[sl][sr][sc]=1;
while(top<tail)
{
Place x=q[top];
if(x.pl==el&&x.pr==er&&x.pc==ec)
{
ans=x.step;
printf("Escaped in %d minute(s).\n",ans);
return;
}
top++;
//上
if((level[x.pl].maze[x.pr-1][x.pc]=='.'||level[x.pl].maze[x.pr-1][x.pc]=='E')&&!vis[x.pl][x.pr-1][x.pc])
{
q[tail].pl=x.pl;
q[tail].pr=x.pr-1;
q[tail].pc=x.pc;
q[tail++].step=x.step+1;
vis[x.pl][x.pr-1][x.pc]=1;
}
//左
if((level[x.pl].maze[x.pr][x.pc-1]=='.'||level[x.pl].maze[x.pr][x.pc-1]=='E')&&!vis[x.pl][x.pr][x.pc-1])
{
q[tail].pl=x.pl;
q[tail].pr=x.pr;
q[tail].pc=x.pc-1;
q[tail++].step=x.step+1;
vis[x.pl][x.pr][x.pc-1]=1;
}
//下
if((level[x.pl].maze[x.pr+1][x.pc]=='.'||level[x.pl].maze[x.pr+1][x.pc]=='E')&&!vis[x.pl][x.pr+1][x.pc])
{
q[tail].pl=x.pl;
q[tail].pr=x.pr+1;
q[tail].pc=x.pc;
q[tail++].step=x.step+1;
vis[x.pl][x.pr+1][x.pc]=1;
}
//右
if((level[x.pl].maze[x.pr][x.pc+1]=='.'||level[x.pl].maze[x.pr][x.pc+1]=='E')&&!vis[x.pl][x.pr][x.pc+1])
{
q[tail].pl=x.pl;
q[tail].pr=x.pr;
q[tail].pc=x.pc+1;
q[tail++].step=x.step+1;
vis[x.pl][x.pr][x.pc+1]=1;
}
//升
if((level[x.pl+1].maze[x.pr][x.pc]=='.'||level[x.pl+1].maze[x.pr][x.pc]=='E')&&!vis[x.pl+1][x.pr][x.pc])
{
q[tail].pl=x.pl+1;
q[tail].pr=x.pr;
q[tail].pc=x.pc;
q[tail++].step=x.step+1;
vis[x.pl+1][x.pr][x.pc]=1;
}
//降
if((level[x.pl-1].maze[x.pr][x.pc]=='.'||level[x.pl-1].maze[x.pr][x.pc]=='E')&&!vis[x.pl-1][x.pr][x.pc])
{
q[tail].pl=x.pl-1;
q[tail].pr=x.pr;
q[tail].pc=x.pc;
q[tail++].step=x.step+1;
vis[x.pl-1][x.pr][x.pc]=1;
}
}
printf("Trapped!\n");
}
int main()
{
int l,r,c;
char ch;
while(scanf("%d%d%d",&l,&r,&c)==3)
{
if(l==0&&r==0&&c==0)break;
for(int i=1;i<=l;i++)
for(int j=1;j<=r;j++)
for(int k=1;k<=c;k++)
{
cin>>ch;
level[i].maze[j][k]=ch;
if(ch=='S')
{
sl=i;
sr=j;
sc=k;
}
if(ch=='E')
{
el=i;
er=j;
ec=k;
}
}
for(int i=1;i<=l;i++)
for(int k=0;k<=c+1;k++)
{
level[i].maze[0][k]='#';
level[i].maze[r+1][k]='#';
}
for(int i=1;i<=l;i++)
for(int j=1;j<=r;j++)
{
level[i].maze[j][0]='#';
level[i].maze[j][c+1]='#';
}
for(int j=0;j<=r;j++)
for(int k=0;k<=c;k++)
{
level[0].maze[j][k]='#';
level[l+1].maze[j][k]='#';
}
BFS();
}
}