【题目描述】
这题是一个三维的迷宫题目,其中用‘.’表示空地,‘#’表示障碍物,‘S’表示起点,‘E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。可以上下左右前后移动,每次都只能移到相邻的空位,每次需要花费一分钟,求从起点到终点最少要多久。
【输入】
“”
一组测试测试数据表示一个三维迷宫:
前三个数,分别表示层数、一个面的长和宽,后面是每层的平面图。前三个数据为三个零表示结束。
【输出】
最小移动次数。
【输入样例】
3 4 5
S....
.###.
.##..
###.#
#####
#####
##.##
##...
#####
#####
#.###
####E
1 3 3
S##
#E#
###
0 0 0
【输出样例】
Escaped in 11 minute(s).
Trapped!
背过模板的小伙伴都知道,这种题目只需用简单的BFS就可以AC,不过有个注意的点,那就是直接用这种模板:
#include<bits/stdc++.h>
using namespace std;
int r,l,b;
int ans=-1;
int dx[6]={0,0,1,-1,0,0};
int dy[6]={1,-1,0,0,0,0};
int dz[6]={0,0,0,0,1,-1};
char a[31][31][31];
struct point{
int x;
int y;
int z;
int dis;
};
int ex,ey,ez,sx,sy,sz;
point temp;
queue<point> q;
int s[31][31][31];
void bfs(int sx,int sy,int sz){
temp.x=sx;
temp.y=sy;
temp.z=sz;
temp.dis=0;
q.push(temp);
while(!q.empty()){
for(int i=0;i<6;i++){
int x=q.front().x+dx[i];
int y=q.front().y+dy[i];
int z=q.front().z+dz[i];
if((a[z][x][y]=='.')&&x>=1&&x<=r&&y>=1&&y<=l&&z>=1&&z<=b){
if(s[z][x][y]<=0){
temp.x=x;
temp.y=y;
temp.z=z;
temp.dis=q.front().dis+1;
s[z][x][y]=temp.dis;
q.push(temp);
if(s[ez][ex][ey]>0){
ans=s[ez][ex][ey];
return;
}
}
}
}
// cout<<x<<" "<<y<<" "<<z<<endl;
q.pop();
}
}
int main(){
while(1){
ans=-1;
cin>>b>>r>>l;
if(!b&&!r&&!l) break;
memset(s,0,sizeof(s));
for(int i=1;i<=b;i++){
for(int j=1;j<=r;j++){
for(int k=1;k<=l;k++){
cin>>a[i][j][k];
if(a[i][j][k]=='E'){
ex=j;
ey=k;
ez=i;
a[i][j][k]='.';
}
if(a[i][j][k]=='S'){
sx=j;
sy=k;
sz=i;
}
}
}
}
bfs(sx,sy,sz);
if(ans<0) cout<<"Trapped!"<<endl;
else cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
}
return 0;
}
就可以获得20分的佳绩,为什么呢,注意到题目中的字眼
“多组测试数据。”
也就是说,上一个测试数据的ANS可能被带到这一个数据来了,所以加一个用来清理队列的while就AC了
AC代码:
#include<bits/stdc++.h>
using namespace std;
int r,l,b;
int ans=-1;
int dx[6]={0,0,1,-1,0,0};
int dy[6]={1,-1,0,0,0,0};
int dz[6]={0,0,0,0,1,-1};
char a[31][31][31];
struct point{
int x;
int y;
int z;
int dis;
};
int ex,ey,ez,sx,sy,sz;
point temp;
queue<point> q;
int s[31][31][31];
void bfs(int sx,int sy,int sz){
temp.x=sx;
temp.y=sy;
temp.z=sz;
temp.dis=0;
q.push(temp);
while(!q.empty()){
for(int i=0;i<6;i++){
int x=q.front().x+dx[i];
int y=q.front().y+dy[i];
int z=q.front().z+dz[i];
if((a[z][x][y]=='.')&&x>=1&&x<=r&&y>=1&&y<=l&&z>=1&&z<=b){
if(s[z][x][y]<=0){
temp.x=x;
temp.y=y;
temp.z=z;
temp.dis=q.front().dis+1;
s[z][x][y]=temp.dis;
q.push(temp);
if(s[ez][ex][ey]>0){
ans=s[ez][ex][ey];
return;
}
}
}
}
// cout<<x<<" "<<y<<" "<<z<<endl;
q.pop();
}
}
int main(){
while(1){
while(!q.empty()) q.pop();
ans=-1;
cin>>b>>r>>l;
if(!b&&!r&&!l) break;
memset(s,0,sizeof(s));
for(int i=1;i<=b;i++){
for(int j=1;j<=r;j++){
for(int k=1;k<=l;k++){
cin>>a[i][j][k];
if(a[i][j][k]=='E'){
ex=j;
ey=k;
ez=i;
a[i][j][k]='.';
}
if(a[i][j][k]=='S'){
sx=j;
sy=k;
sz=i;
}
}
}
}
bfs(sx,sy,sz);
if(ans<0) cout<<"Trapped!"<<endl;
else cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
}
return 0;
}
给你们看一下我的黑历史