这种迷宫题我认为用BFS比较快的,终于对BFS有理解更深了一点,
这道题,BFS+队列,首先我们需要先建一个迷宫,然后开始从起点遍历,遍历到终点,输出时间(树根),
这种3维的遍历时就是6个方向,上下左右前后,然后我们需要一个结构体来标记这个人的位置,然后开始遍历6个位置,遍过的位置进行标记,不需要第二次遍历,
我们先将人的开始的位置压入队列,弹出,压入队列人旁的6个位置,依次遍历,然后更新着这个当前的位置来并拉入队列,时间+1,直到找到出口。
下面是代码
#include<queue>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
//思路就是BFS+队列
using namespace std;
char map[32][32][32];//输入迷宫
int vis[35][35][35];//标记已经走过的位置
int to[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};//移动坐标
int n,m,k;//定义迷宫的大小
int sx,sy,sz,ex,ey,ez;//sx是初始位置,ex是结束位置
struct node{
int x,y,z;//记录当前的位置
int step;//记录时间(步数)
};
//检查函数
int check(int x,int y,int z){
if(x<0||y<0||z<0||x>=k||y>=n||z>=m)//判断是否越界
return 1;
else if(map[x][y][z]=='#')//判断是否是墙
return 1;
else if(vis[x][y][z])//判断是否走过
return 1;
return 0;
return 0;
}
int BFS(){
int i;
node a,next;//定义2个结构体,一个表示当前位置,一个表示下一个位置
queue<node> Q;//定义一个队列
a.x=sx;//初始化第一个结构体
a.y=sy;
a.z=sz;
a.step=0;
vis[sx][sy][sz]=1;
Q.push(a);//将a压入队列
while(!Q.empty())
{
a=Q.front();//当前位置是队首
Q.pop();//弹出队首
if(a.x==ex&&a.y==ey&&a.z==ez)//判断是否跑到出口
return a.step;//返回步数
for(int i=0;i<6;i++)//开始遍历
{
next.x=a.x+to[i][0];
next.y=a.y+to[i][1];
next.z=a.z+to[i][2];
if(check(next.x,next.y,next.z))//检查
continue;
vis[next.x][next.y][next.z]=1;//标记走过
next.step=a.step+1;//步数+
Q.push(next);//拉入队列
}
}
return 0;
}
int main(){
int i,j,r;
while(cin>>k>>n>>m)//输入迷宫规格
{
if(n==0&&m==0&&k==0)
{
break;
}
memset(map,'\0',sizeof(map));//初始化
memset(vis,0,sizeof(vis));//初始化为0
for(i = 0; i<k; i++)//开始建造迷宫 三层
{
for(j = 0; j<n; j++)//n行
{
cin>>map[i][j];
for(r = 0; r<m; r++)
{
if(map[i][j][r] == 'S')
{
sx = i,sy = j,sz = r;
}
else if(map[i][j][r] == 'E')
{
ex = i,ey = j,ez = r;
}
}
}
}
int ans;
ans=BFS();
if(ans)
cout<<"Escaped in "<<ans<<" minute(s)."<<endl;
else
cout<<"Trapped!"<<endl;
}
return 0;
}