c++ 逃离地牢

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).\n",v.step);//输出步数
                return 0;//退出
            }
            e++;
            q[e]=v;
            used[v.x][v.y][v.z]=1;
        }
    }
    printf("Trapped!");//如果之前没有退出 就是没有路线
    return 0;
}
posted @ 2019-08-03 17:02  牛大了的牛大  阅读(461)  评论(0编辑  收藏  举报