暑假訓練第9天, OJ 2251,3D迷宮。

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章