C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N=101;
int Hy=-1,Wx=-1,Lz=-1;//初始化为-1,为了判断“结束输入”
char rs[N][N][N];
int room[N][N][N];
int d[N][N][N];
struct node{
int z,x,y;
};
node st,ed;//设置起点,终点
#define CHECK(x,y,z) (x>=0&&x<Wx&&y>=0&&y<Hy&&z>=0&&z<Lz)//判断边界
int dir[6][3]={//和y总形式不同,但是用起来一样,可以换成y总的方式(个人习惯)
{-1,0,0},
{0,-1,0},
{1,0,0},
{0,1,0},
{0,0,1},
{0,0,-1}
};
int bfs(int dz,int dx,int dy){
memset(d,-1,sizeof d);//初始化距离
queue <node> q;
node start,next;
q.push({dz,dx,dy});
d[dz][dx][dy]=0;
while(!q.empty()){
start=q.front();
q.pop();
for(int i=0;i<6;i++){
next.x=start.x+dir[i][0];
next.y=start.y+dir[i][1];
next.z=start.z+dir[i][2];
if(CHECK(next.x,next.y,next.z)&&room[next.z][next.x][next.y]==0&&d[next.z][next.x][next.y]==-1){//当房间可以走,且没走过时
d[next.z][next.x][next.y]=d[start.z][start.x][start.y]+1;
q.push(next);
if(next.x==ed.x&&next.y==ed.y&&next.z==ed.z) return d[ed.z][ed.x][ed.y];//到达终点,输出
}
}
}
return -1;//如果没有找到,返回-1
}
int main(){
while(cin>>Lz>>Wx>>Hy){
if(Lz==0&&Wx==0&&Hy==0) break;//结束输入
memset(room,0,sizeof room);//重置空间,默认全可以走
for(int k=0;k<Lz;k++)//层
for(int i=0;i<Wx;i++)//行
for(int j=0;j<Hy;j++){//列 ,虽然顺序有点乱但是逻辑不影响
cin>>rs[k][i][j];//换成scanf速度快500ms
if(rs[k][i][j]=='#') room[k][i][j]=1;//障碍设为1,在这里直接转化为走迷宫问题
else if(rs[k][i][j]=='S') st={k,i,j};//找到开始和结束
else if(rs[k][i][j]=='E') ed={k,i,j};
}
int t=bfs(st.z,st.x,st.y);
if(t!=-1)
cout<<"Escaped in "<<t<<" minute(s)."<<endl;
else cout<<"Trapped!"<<endl;
}
return 0;
}
时间
把cin换成scanf()可以优化500ms;
C:994ms;
C++:1502ms;
C代码
#include<bits/stdc++.h>
using namespace std;
const int N=101;
int Hy=-1,Wx=-1,Lz=-1;//初始化为-1,为了判断“结束输入”
int room[N][N][N];
int d[N][N][N];
char g[N][N][N];
struct node{
int z,x,y;
};
node st,ed;//设置起点,终点
#define CHECK(x,y,z) (x>=0&&x<Wx&&y>=0&&y<Hy&&z>=0&&z<Lz)//判断边界
int dir[6][3]={//和y总形式相同,可以换成y总的方式
{-1,0,0},
{0,-1,0},
{1,0,0},
{0,1,0},
{0,0,1},
{0,0,-1}
};
int bfs(int dz,int dx,int dy){
memset(d,-1,sizeof d);//初始化距离
queue <node> q;
node start,next;
q.push({dz,dx,dy});
d[dz][dx][dy]=0;
while(!q.empty()){
start=q.front();
q.pop();
for(int i=0;i<6;i++){
next.x=start.x+dir[i][0];
next.y=start.y+dir[i][1];
next.z=start.z+dir[i][2];
if(CHECK(next.x,next.y,next.z)&&room[next.z][next.x][next.y]==0&&d[next.z][next.x][next.y]==-1){//当房间可以走,且没走过时
d[next.z][next.x][next.y]=d[start.z][start.x][start.y]+1;
q.push(next);
if(next.x==ed.x&&next.y==ed.y&&next.z==ed.z) return d[ed.z][ed.x][ed.y];//到达终点,输出
}
}
}
return -1;//如果没有找到,返回-1
}
int main(){
while(scanf("%d%d%d",&Lz,&Wx,&Hy)){
if(Lz==0&&Wx==0&&Hy==0) break;//结束输入
memset(room,0,sizeof room);//重置空间,默认全可以走
for(int k=0;k<Lz;k++)//层
for(int i=0;i<Wx;i++)//行
{
scanf("%s", g[k][i]);
for(int j=0;j<Hy;j++){//列 ,虽然顺序有点乱但是逻辑不影响
char rs = g[k][i][j];
if(rs=='#') room[k][i][j]=1;//障碍设为1
else if(rs=='S') st={k,i,j};//找到开始和结束
else if(rs=='E') ed={k,i,j};
}
}
int t=bfs(st.z,st.x,st.y);
if(t!=-1)
printf("Escaped in %d minute(s).\n",t);
else printf("Trapped!\n");
}
return 0;
}