暑假训练第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;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值