题目描述
你参加了一项秘密任务,在任务过程中你被困在了一个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 }