zoukankan      html  css  js  c++  java
  • 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).
    ",v.step);//输出步数
                    return 0;//退出
                }
                e++;
                q[e]=v;
                used[v.x][v.y][v.z]=1;
            }
        }
        printf("Trapped!");//如果之前没有退出 就是没有路线
        return 0;
    }
    
  • 相关阅读:
    PHP数组简介
    如何在不使用系统函数的情况下实现PHP中数组系统函数的功能
    弹性盒布局display:flex详解
    关于JS面向对象中原型和原型链以及他们之间的关系及this的详解
    如何使用AngularJS对表单提交内容进行验证
    如何用canvas画布画旋转的五角星
    MYSQL常用函数以及如何操作数据
    数据库基础以及表的创建
    PHP中的OOP
    PHP中数组的遍历
  • 原文地址:https://www.cnblogs.com/LJA001162/p/11295441.html
Copyright © 2011-2022 走看看