這種迷宮題我認爲用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;
}