1248:Dungeon Master 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 11012 通过数: 4403 【题目描述】
这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。
【输入】
多组测试数据。
一组测试测试数据表示一个三维迷宫:
前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。
【输出】
【输入样例】 3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0 【输出样例】 Escaped in 11 minute(s).
Trapped! ac: //Writed by Wangzhimin Date:2022.4.28 #include <bits/stdc++.h> int l,r,c; char visited[105][105][105]; struct step1{ int x; int y; int z; int step; step1(int xx,int yy,int zz,int s):x(xx),y(yy),z(zz),step(s){ }; }; using namespace std; int visit2[1005]; int num=0; int main() { int k,i,j; int l1,r1,c1,l2,r2,c2; while(scanf("%d%d%d",&l,&r,&c)&&l!=0&&r!=0&&c!=0){ queue <step1> q; memset(visited,0,sizeof(visited)); int flag=0; for(i=0;i<l;i++) for(j=0;j<r;j++) scanf("%s",visited[i][j]); for(k=0;k<l;k++) for(i=0;i<r;i++) for(j=0;j<c;j++)//找到在哪一层和哪一行、哪一列 { if(visited[k][i][j]=='S') { r1=i;l1=k; c1=j; } if(visited[k][i][j]=='E') { r2=i;l2=k; c2=j; } } q.push(step1(l1,r1,c1,0)); //memset(visited,0,sizeof(visited)); visited[l1][r1][c1]='#'; while(!q.empty()){ step1 s=q.front(); //cout<<s.x<<s.y<<s.step<<endl; if(s.x==l2&&s.y==r2&&s.z==c2){ visit2[num++]=s.step; flag=1; break; } else{ if(s.x-1>=0&&visited[s.x-1][s.y][s.z]!='#'){//前移 q.push(step1(s.x-1,s.y,s.z,s.step+1)); visited[s.x-1][s.y][s.z]='#'; } if(s.x+1<l&&visited[s.x+1][s.y][s.z]!='#')//后移 { q.push(step1(s.x+1,s.y,s.z,s.step+1)); visited[s.x+1][s.y][s.z]='#'; } if(s.y+1<r&&visited[s.x][s.y+1][s.z]!='#'){//右移 q.push(step1(s.x,s.y+1,s.z,s.step+1)); visited[s.x][s.y+1][s.z]='#'; } if(s.y-1>=0&&visited[s.x][s.y-1][s.z]!='#'){//左移 q.push(step1(s.x,s.y-1,s.z,s.step+1)); visited[s.x][s.y-1][s.z]='#'; } if(s.z+1<c&&visited[s.x][s.y][s.z+1]!='#'){//上移 q.push(step1(s.x,s.y,s.z+1,s.step+1)); visited[s.x][s.y][s.z+1]='#'; } if(s.z-1>=0&&visited[s.x][s.y][s.z-1]!='#'){//下移 q.push(step1(s.x,s.y,s.z-1,s.step+1)); visited[s.x][s.y][s.z-1]='#'; } q.pop(); } } if(flag==0) visit2[num++]=0; } for(i=0;i<num;i++) { if(visit2[i]>0) cout<<"Escaped in "<<visit2[i]<<" minute(s)."<<endl; else cout<<"Trapped!"<<endl;} return 0; } |