一个简单的BFS题
点击打开链接https://vjudge.net/contest/207466#problem/A
点击打开链接http://poj.org/problem?id=2251
Description - 题目描述
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?
Input - 输入
输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度。
R和C分别表示每层空间的行与列的大小。
随后L层地牢,每层R行,每行C个字符。
每个字符表示空间的一个单元。'#'表示不可通过单元,'.'表示空白单元。你的起始位置在'S',出口为'E'。
每层空间后都有一个空行。L,R和C均为0时输入结束。
Output - 输出
每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!
Sample Input - 输入样例
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
Sample Output - 输出样例
Escaped in 11 minute(s). Trapped!
这道题是学长用来给我们讲解的例题,后来我当做模板来做的,以下是代码
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
using namespace std;
char map[33][33][33];
bool vis[33][33][33];
struct Node{
int x,y,z,step;
}st;
int dx[] = {1, -1, 0, 0, 0, 0};
int dy[] = {0, 0, 1, -1, 0, 0};
int dz[] = {0, 0, 0, 0, 1, -1};
int bfs()
{
queue<Node> q;
memset(vis,false,sizeof(vis)); //初始化为false,所有路都可以走
vis[st.z][st.x][st.y] = true;
q.push(st);
while ( !q.empty() )
{
Node t;
t = q.front();q.pop();
if ( map[t.z][t.x][t.y] == 'E' ) //当走到终点时,返回步数
{
return t.step;
}
for ( int i = 0 ; i < 6; i++ ) //走一次循环会向上下左右前后六个方向各走一格
{
int xx = t.x + dx[i];
int yy = t.y + dy[i];
int zz = t.z + dz[i];
if ( !vis[zz][xx][yy] && map[zz][xx][yy] != '#') //判断当前是否为边界和是否走过
{
Node tmp;
tmp.x = xx;
tmp.y = yy;
tmp.z = zz;
tmp.step = t.step + 1;
q.push(tmp); //把当前节点放入队列中
vis[tmp.z][tmp.x][tmp.y] = true; //走过的地方标记为true
}
}
}
return -1;
}
int main()
{
int L,R,C;
while ( ~scanf("%d%d%d",&L,&R,&C) && L )
{
int i,j,k;
for( i = 0; i <= L+1; i++ )
{
for ( j = 0; j <= R+1; j++ )
{
for ( k = 0; k <= C+1; k++ )
{
map[i][j][k] = '#'; //给地图外围设置一圈墙用来判断边界
}
}
}
for ( i = 1; i <= L; i++ )
{
for ( j = 1; j <= R; j++ )
{
for ( k = 1; k <= C; k++ )
{
cin >> map[i][j][k];
if( map[i][j][k] == 'S' ) //记录起始位置
{
st.x = j;
st.y = k;
st.z = i;
st.step = 0;
}
}
}
}
int Jduge = bfs();
if ( Jduge == -1 )
cout << "Trapped!" << endl;
else cout << "Escaped in " << Jduge << " minute(s)." << endl;
}
}