ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

E - Dungeon Master BFS

2019-07-24 23:55:29  阅读:298  来源: 互联网

标签:Dungeon int mark BFS Master && e1 e3 e2


[NWUACM] 
你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?

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!

思路:这个题目就是6个方向的BFS把 方向设定好,,找到起点找到终点,然后BFS吧

#include<iostream>
#include<queue>
#include<cstdio> 
#include<cstdio>
#include<cstring>
#define N 33
//int base[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };
using namespace std;
int l,n,m;
char arr[N][N][N];
int mark[N][N][N];
int sa,sb,sc;
int ea,eb,ec;
struct stu{
    int a,b,c;//坐标
    int s;//距离
}e1,e2,e3;
int base[6][3] = { {-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1} };//6个方向
void BFS(){
    memset(mark,0,sizeof(mark));
    queue<stu >s;
    e1.a=sa,e1.b=sb,e1.c=sc;
    e1.s=0;
    s.push(e1);
    mark[sa][sb][sc]=1;
    
    int ans=-1;
    while(s.size()){
        e2=s.front();
        s.pop();
        if(e2.a==ea && e2.b==eb && e2.c==ec)//判断是否到达了终点
        {
            ans=e2.s;
            break;
        }
        for(int i=0;i<6;i++){
            e3.a=e2.a+base[i][0];
            e3.b=e2.b+base[i][1];
            e3.c=e2.c+base[i][2];
            if((e3.a>= 0) && (e3.a < l) && (e3.b >= 0) && (e3.b < n) && (e3.c >= 0) && (e3.c < m)
             && (!mark[e3.a][e3.b][e3.c]) && (arr[e3.a][e3.b][e3.c] == '.' || arr[e3.a][e3.b][e3.c] == 'E'))
            {
                e3.s=e2.s+1;
                mark[e3.a][e3.b][e3.c]=1;
                s.push(e3);
            }
            
        }
    }
    if(ans==-1){
        cout<<"Trapped!"<<endl;
    }
    else {
        printf("Escaped in %d minute(s).\n",ans);
    }
}

int main()
{
    while(cin>>l>>n>>m){
        if(n==0&&m==0&&l==0)
            break;
        for(int i=0;i<l;i++){
            for(int j=0;j<n;j++){
                scanf("%s",&arr[i][j]);
            }
        }
        for(int i=0;i<l;i++){
            for(int j=0;j<n;j++){
                for(int k=0;k<m;k++){
                    if(arr[i][j][k]=='S')
                    {
                        sa=i;
                        sb=j;
                        sc=k;
                    }
                    else if(arr[i][j][k]=='E'){
                        ea=i;
                        eb=j;
                        ec=k;
                    }
                }
            }
        }
        BFS();
    }
    return 0;
}

 




标签:Dungeon,int,mark,BFS,Master,&&,e1,e3,e2
来源: https://www.cnblogs.com/Accepting/p/11241617.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有