洛谷 P2360 地下城主

题目描述

你参加了一项秘密任务,在任务过程中你被困在了一个3D的地下监狱里面,任务是计时的,你现在需要在最短的时间里面从地牢里面逃出来继续你的任务。地牢由若干层组成,每一层的形状都是长宽一样的矩形,地牢被分成了若干小格,当小格没有被岩石所占据时,你可以前往所在小格的前方,后方,左方,右方,上层,下层的小格。每走一小格花费一分钟时间。

你能不能顺利的从地牢里面逃出来呢?如果可以,那所需要的最短时间又是多少呢?

//据说出口藏有神器。

输入输出格式

输入格式:

 

第一行输入L R C(L为地牢的层数,R为每层小格的行数,C为每层小格的列数,其中1<=L,R,C<=30)。

第二行开始输入L层地牢的格局,每一层有R行,每行有C个小格,两层地牢中间有空行隔开。

输入的文件中,“S”代表你的起始点,“E”代表你所要到达的出口,“#”为小格被岩石占据,“.”表示没有被岩石占据。

 

输出格式:

 

输出包含一行,当你可以顺利到达出口时请输出:

“Escaped in x minute(s).”,x代表你所花费的最短时间;

否则请输出:“Trapped!”。

 

输入输出样例

输入样例#1: 复制
3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E
输出样例#1: 复制
Escaped in 11 minute(s).

说明

来源:POJ 2251

思路:搜索。

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
string s;
int n,m,l;
int x1,y1,z1;
int f[10001];
int be1,be2,be3;
int en1,en2,en3;
bool a[31][31][31];
int tail=1,head,sum;
int d1[6]={1,-1,0,0,0,0};
int d2[6]={0,0,-1,1,0,0};
int d3[6]={0,0,0,0,1,-1};
int x[10001],y[10001],z[10001];
int main(){
    cin>>l>>n>>m;
    for(int i=1;i<=l;i++)
        for(int j=1;j<=n;j++){
            cin>>s;
            for(int k=0;k<m;k++){
                if(s[k]=='.')    a[i][j][k+1]=1;
                if(s[k]=='S'){ be1=i;be2=j;be3=k+1; }
                if(s[k]=='E'){ en1=i;en2=j;en3=k+1;a[i][j][k+1]=1; }
            }
        }
    x[tail]=be1;y[tail]=be2;z[tail]=be3;
    while(head<=tail){
        head++;
        for(int i=0;i<6;i++){
            x1=x[head]+d3[i];
            y1=y[head]+d1[i];
            z1=z[head]+d2[i];
            if(a[x1][y1][z1]&&x1>=1&&x1<=l&&y1>=1&&y1<=n&&z1>=1&&z1<=m){
                tail++;
                a[x1][y1][z1]=0;
                x[tail]=x1;
                y[tail]=y1;
                z[tail]=z1;
                f[tail]=head;
                if(x1==en1&&y1==en2&&z1==en3){
                    while(f[tail]){
                        tail=f[tail];
                        sum++;
                    }
                    cout<<"Escaped in "<<sum<<" minute(s)."<<endl;
                    return 0;
                }
            }
        }
    }
    cout<<"Trapped!"<<endl;
}

 

posted @ 2017-11-28 21:57  一蓑烟雨任生平  阅读(252)  评论(0编辑  收藏  举报