Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
此题目是三维的迷宫问题,要想解决本题,首先要有二维的BFS相关知识,
有了这个之后,还是不行的,还要搞清楚行走的坐标的表示。
一开始,我本以为要开一个三维的数组来表示走法,但是,用二维的才是正确的。
如何正确,我将在代码中做出详细的说明。另外的一些注意事项,也会在代码中
做出详细的解释。
#include<iostream>
#include<string.h>
using namespace std;
int level, row, col, i, j, k, sx, sy, sz, tx, ty, tz;
char map[35][35][35];
int used[35][35][35];
int step[35][35][35];
int direction[6][3] = {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
///好了,现在来好好解释一下direction[][]数组,也就是走法。一共有6种走法,上下左右前后。
///故要开direction[6][];为何要开direction[][3]呢?也就是这个3该如何解释呢?
///学过几何的人都知道x,y,z的空间坐标轴。这就是3的来历。
///拿{0,0,1}来说,表示x=0, y=0, z=1,很明显了,这种走法表示的是向上走了。
///其它的类似,不再说了。同样的,direction[4][2]中的2,也是同样的道理。只不过没有了z坐标。
structpoint
{
int x,y,z;
}queue[30000];
int BFS(int sz, int sx, int sy)
{
used[sz][sx][sy] = 1;
int head = 0, tail = 0;
queue[head].z = sz;
queue[head].x = sx;
queue[head].y = sy;
head++;
while(tail<head)
{
pointt1 = queue[tail];
tail++;
int m;
for(m=0; m<6; m++)
{
pointt2;
t2.z = t1.z+direction[m][2];
t2.x = t1.x+direction[m][0];
t2.y = t1.y+direction[m][1];
if(t2.z>=0 && t2.z<level && t2.x>=0 && t2.x<row && t2.y>=0 && t2.y<col && used[t2.z][t2.x][t2.y]==0)
{
if(map[t2.z][t2.x][t2.y]=='.')
{
step[t2.z][t2.x][t2.y] = step[t1.z][t1.x][t1.y]+1;
used[t2.z][t2.x][t2.y] = 1;
queue[head] = t2;
head++;
}
else if(map[t2.z][t2.x][t2.y]=='E')
return (step[t1.z][t1.x][t1.y]+1);
}
}
}
return -1;
}
int main()
{
while(cin>>level>>row>>col && (level+row+col))
{
memset(used, 0, sizeof(used));
memset(step, 0, sizeof(step));
for(i=0; i<level; i++)
for(j=0; j<row; j++)
for(k=0; k<col; k++)
{
cin>>map[i][j][k];
if(map[i][j][k]=='S')
///一定要注意这里的map[i][j][k]中的三个参数i, j, k.
/// i 对应层数,也就是z轴
/// j 对应行数,也就是x轴
/// z 对应列数,也就是y轴
///因此,在下面的运算中要一一对应起来的。否则将会出错的。
{
sx = j; sy = k; sz = i;
}
}
int result = BFS(sz, sx, sy);
if( result==-1 )
cout<<"Trapped!"<<endl;
else
cout<<"Escaped in "<<result<<" minute(s)."<<endl;
}
}