Description
Is an escape possible? If yes, how long will it take?
Input
The input consists of a number of dungeons. Each dungeon description starts with a line containing three integers L, R and C (all limited to 30 in size).
L is the number of levels making up the dungeon.
R and C are the number of rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.
Output
Each maze generates one line of output. If it is possible to reach the exit, print a line of the form
Escaped in x minute(s).
where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
2014年第一道搜索题目,出了很多问题,这是一道3维基础广搜模板题目,记录一下。
#include <cstdio>
#include<iostream>
#include <queue>
using namespace std;
const int N = 85;
char map[N][N][N]; //zhuyi
int l,r,c;
struct Node
{
int x,y,z;
int step;
};
int dir[8][4]=
{
{0,0,1},
{0,0,-1},
{0,1,0},
{0,-1,0},
{1,0,0},
{-1,0,0}
};
int Bfs(Node st,Node en)
{
queue<Node> q;
Node tmd,tmp;
q.push(st);
while(!q.empty())
{
tmd=q.front();q.pop(); //初始片段搜索结束条件的地方
if(tmd.x==en.x && tmd.y==en.y && tmd.z==en.z)
return tmd.step;
for(int i=0;i<6;i++)
{
tmp.x=tmd.x+dir[i][0];
tmp.y=tmd.y+dir[i][1];
tmp.z=tmd.z+dir[i][2];
tmp.step=tmd.step+1;
if(map[tmp.x][tmp.y][tmp.z]!='#'&&tmp.x>=0 &&tmp.y>=0 && tmp.z>=0 &&tmp.x<l&&tmp.y<r&&tmp.z<c)
{ //注意上面的搜索条件,是!=‘#’ 错在了这里
q.push(tmp);
map[tmp.x][tmp.y][tmp.z]='#';
}
}
}
return -1;
}
int main()
{
while(~scanf("%d%d%d",&l,&r,&c))
{
if(l==0 && r==0 &&c==0)
break;
getchar();
Node st,en;
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
for(int k=0;k<c;k++)
{
scanf("%c",&map[i][j][k]);
if(map[i][j][k]=='S')
{
st.x=i; st.y=j; st.z=k;st.step=0;
}
if(map[i][j][k]=='E')
{
en.x=i,en.y=j,en.z=k;
}
}
getchar();
}
if(i!=l-1)
getchar();
}
// cout<<st.x<<st.y<<st.z<<en.x<<en.y<<en.z<<endl;
int ans = Bfs(st,en);
if(ans == -1){
printf("Trapped!\n");
}else
{
printf("Escaped in %d minute(s).\n",ans);
}/*
for(int i=0;i<l;i++)
{
for(int j=0;j<r;j++)
{
for(int k=0;k<c;k++)
printf("%c ",map[i][j][k]);
putchar('\n');
}
putchar('\n');
}*/
}
return 0;
}