【POJ 2251】地下城主(BFS)

题目描述

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

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

//据说出口藏有神器。

输入输出格式

输入格式:

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

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

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

输出格式:

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

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

否则请输出:“Trapped!”。

 广搜裸题,只不过加多一维而已,眼睛都要瞎了XD。
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 
 5 struct loc{
 6     int x,y,z;
 7 };
 8 
 9 int l,r,c,sx,sy,sz,ex,ey,ez;
10 char a[32][32][32];
11 int dis[32][32][32];
12 int px[]={1,-1,0,0,0,0};
13 int py[]={0,0,1,-1,0,0};
14 int pz[]={0,0,0,0,1,-1};
15 std::queue<loc> que;
16 #define min(x,y) (x<y?x:y)
17 
18 void bfs(void){
19     while(!que.empty()){
20         loc u=que.front();
21         que.pop();
22         int tox=u.x;
23         int toy=u.y;
24         int toz=u.z;
25         for(int i=0;i<6;++i){
26             if((a[tox+px[i]][toy+py[i]][toz+pz[i]]=='#'))continue;
27             if(dis[tox][toy][toz]+1<dis[tox+px[i]][toy+py[i]][toz+pz[i]]){
28                 dis[tox+px[i]][toy+py[i]][toz+pz[i]]=dis[tox][toy][toz]+1;
29                 que.push((loc){tox+px[i],toy+py[i],toz+pz[i]});
30             }
31         }
32     }
33 }
34 
35 int main(void){
36     scanf("%d%d%d",&l,&r,&c);
37     for(int i=0;i<=l+1;++i)
38         for(int j=0;j<=r+1;++j)
39             for(int k=0;k<=c+1;++k)
40                 a[i][j][j]='#';
41     for(int i=1;i<=l;++i){
42         for(int j=1;j<=r;++j){
43             for(int k=1;k<=c;++k){
44                 std::cin>>a[i][j][k];
45                 dis[i][j][k]=0x7ffffff;
46                 if(a[i][j][k]=='S'){
47                     sx=i;
48                     sy=j;
49                     sz=k;
50                 }
51                 if(a[i][j][k]=='E'){
52                     ex=i;
53                     ey=j;
54                     ez=k;
55                 }
56             }
57         }
58     }
59     dis[sx][sy][sz]=0;
60     que.push((loc){sx,sy,sz});
61     bfs();
62     if(dis[ex][ey][ez]==0x7ffffff)printf("Trapped!");
63     else printf("Escaped in %d minute(s).",dis[ex][ey][ez]);
64 }

 

转载于:https://www.cnblogs.com/gzh01/p/9377579.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值