c++ 逃离地牢
题目描述
贝茜被困在了一个三维立体的地牢里,这个地牢是一个立方体,由通道和岩石组成。贝茜只能往东、南、西、北、上、下六个方向走,且每走一步要花费1个单位的时间。现在将地牢的详细布局给你?你能逃出地牢么?如果能的话,最少要花多少时间呢?
输入
第一行包括三个数L R C,分别表示地牢的长宽高。(长宽高不会超过30)
接下来输入L个R*C的矩阵,两个矩阵之间用一个空行隔开,描述地牢的详细情况。其中‘S’表示贝茜的起点,‘E’表示终点,‘.’表示该位置是通道,可以通行,‘#’表示该位置为岩石,不可以通行。
起点终点各只有一个
输出
如果可以达到终点,输入:” Escaped in x minute(s).”,其中x表示最短的时间;如果无法到达终点,输出:"Trapped!"。
样例输入
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
样例输出
Escaped in 11 minute(s).
提示
(none)
AC代码
#include <stdio.h>
#include <string.h>
int l,r,c;//l表示输入l组矩阵 r表示行 c表示列
char g[40][40][40];//g表示整个三维地牢
struct point//结构体
{
int x,y,z,step;//x,y,z坐标 step是步数
};
int dx[6]={0,0,1,-1,0,0};//加上dx,dy,dz就是可用的方向
int dy[6]={0,0,0,0,1,-1};//up
int dz[6]={1,-1,0,0,0,0};//up
point q[30000],s,t;//定义变量
bool used[40][40][40];//False是没有走过的 True是已经走过的
int f,e;//e是入队 f是出队
int main()
{
scanf("%d %d %d",&l,&r,&c);//输入三个数 具体见第4行
for(int i=0;i<l;i++)//循环l次输入矩阵
for(int j=0;j<r;j++)//up
{
scanf("%s",g[i][j]);//up
}
memset(used,0,sizeof(used));//格式化used[]为False
for(int i=0;i<l;i++)//重复执行寻找起点
for(int j=0;j<r;j++)
for(int k=0;k<c;k++)
{
if(g[i][j][k]=='S')//找到起点
{
s.x=i,s.y=j,s.z=k,s.step=0;//初始化
f=1,e=1;
q[e]=s;//起点入队
used[s.x][s.y][s.z]=1;//设为已经走过
}
}
while(f<=e)//防止越位
{
point u=q[f++];//u是选定的元素
for (int i=0;i<6;i++)//向6个方向无限拓展
{
point v;
v.x=u.x+dx[i],v.y=u.y+dy[i],v.z=u.z+dz[i];
v.step=u.step+1;
if(v.x<0||v.x>=l||v.y<0||v.y>=r||v.z<0||v.z>=c)continue;//如果在牢房外
if(used[v.x][v.y][v.z]==1)continue;//已经为选择过的
if(g[v.x][v.y][v.z]=='#')continue;//碰到障碍
if(g[v.x][v.y][v.z]=='E')
{
printf("Escaped in %d minute(s).
",v.step);//输出步数
return 0;//退出
}
e++;
q[e]=v;
used[v.x][v.y][v.z]=1;
}
}
printf("Trapped!");//如果之前没有退出 就是没有路线
return 0;
}