【题目描述】 这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。
【输入】 多组测试数据。
一组测试测试数据表示一个三维迷宫:
前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。
【输出】 最小移动次数。
【输入样例】 3 4 5 S.... .###. .##.. ###.#
##.## ##...
#.### ####E 1 3 3 S## #E#
0 0 0 【输出样例】 Escaped in 11 minute(s). Trapped!
#include<bits/stdc++.h>
using namespace std;
struct loc{
int x,y,z;
int cnt;
}loc_st,loc_end,loc_now,loc_next;
queue<loc> q;
int l,r,c;
int dx[10] = {-1,1,0,0,0,0},dy[10] = {0,0,-1,1,0,0},dz[10] = {0,0,0,0,-1,1};
char a[55][55][55];
int bfs(){
while(!q.empty()) q.pop();
loc_st.cnt =0;
q.push(loc_st);
while(!q.empty()){
loc_now = q.front();
q.pop();
// cout<<loc_now.x<<" "<<loc_now.y<<" "<<loc_now.z<<endl;
// if(loc_now.x == loc_end.x &&loc_now.y == loc_end.y && loc_now.z == loc_end.z ){
// retunr loc_now.cnt;
// }
for(int i=0;i < 6;i++){
loc_next.x = loc_now.x +dx[i];
loc_next.y = loc_now.y +dy[i];
loc_next.z = loc_now.z +dz[i];
loc_next.cnt=loc_now.cnt+1;
if(loc_next.x <1 || loc_next.x > l) continue;
if(loc_next.y <1 || loc_next.y > r) continue;
if(loc_next.z <1 || loc_next.x > c) continue;
if(loc_next.x == loc_end.x &&loc_next.y == loc_end.y && loc_next.z == loc_end.z ){
return loc_next.cnt ;
}
if(a[loc_next.x ][loc_next.y ][loc_next.z ] == '.'){
q.push(loc_next);
a[loc_next.x ][loc_next.y ][loc_next.z ] ='#';
}
}
}
return -1;
}
int main(){
for(;;){
cin>>l>>r>>c;
if(l == 0 && r == 0 && c == 0) break;
for(int i=1;i <= l;i++){
for(int j=1;j <= r;j++){
for(int k=1;k <= c;k++){
cin>>a[i][j][k];
if(a[i][j][k] == 'S'){
loc_st.x = i;
loc_st.y = j;
loc_st.z = k;
}else if(a[i][j][k] == 'E'){
loc_end.x = i;
loc_end.y = j;
loc_end.z = k;
}
}
}
}int t = bfs();
if(t == -1) cout<<"Trapped!"<<endl;
else cout<<"Escaped in " <<t<<" minute(s)."<<endl;//Escaped in 11 minute(s).
}
return 0;
}
为什么只得四十分!!!(信奥一本通1248) 求助