地牢大师【三维地图bfs】

地牢大师
您被困在 3D 地牢中,需要找到最快的出路!地牢由单位立方体组成,这些立方体可能充满也可能不充满岩石。向北、向南、向东、向西、向上或向下移动一个单位需要一分钟。你不能对角移动,迷宫四面都是坚固的岩石。

有没有可能逃脱?如果是,需要多长时间?
输入
输入由许多地牢组成。每个地牢描述都以一行包含三个整数 L、R 和 C(大小均限制为 30)开始。
L 是构成地牢的层数。
R 和 C 是构成每个级别的计划的行数和列数。

然后将跟随 L 块 R 行,每行包含 C 个字符。每个字符描述地牢的一个单元。装满岩石的单元格用“#”表示,空单元格用“.”表示。您的起始位置用“S”表示,出口用字母“E”表示。每个级别后都有一个空行。输入以 L、R 和 C 的三个零终止。
输出
每个迷宫产生一行输出。如果可以到达出口,打印一行表格
在 x 分钟内逃脱。

其中 x 替换为逃跑所需的最短时间。
如果无法逃脱,请打印该行
被困!
Sample Input
3 4 5
S…
.###.
.##…
###.#

##.##
##…

#.###
####E

1 3 3
S##
#E#

0 0 0
Sample Output
Escaped in 11 minute(s).
Trapped!
思路:就是普通的BFS求最短路径,只是这里要开三维数组和多一个dz的向上方的方向

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<queue>
using namespace std;
int L,R,C,flag,time;
int ei=0,ej=0,ek=0;
char e[40][40][40];
int vist[40][40][40];
int dx[10]={0,-1,1,0,0,0,0};//三维方向 
int dy[10]={0,0,0,1,-1,0,0};
int dz[10]={0,0,0,0,0,-1,1};
struct dian{
	int x;
	int y;
	int z;
	int step;//保存步数 
};
bool check(int x,int y,int z)
{
	if(vist[x][y][z]==1||x<1||x>L||y<1||y>R||z<1||z>C||e[x][y][z]=='#') return true;
	else return false;
}
void bfs(int x,int y,int z)
{
	vist[x][y][z]=1;
	queue<dian> q;
	q.push(dian{x,y,z,0});//起点压入队列里 
	while(!q.empty()){
		dian node=q.front();
		q.pop();
		if(node.x==ei&&node.y==ej&&node.z==ek){//可以走到终点 
			flag=1;
			time=node.step;//等于终点时,看看走了几步 
			return ;
		}
		for(int i=1;i<=6;i++){//从六个方向走 
		int newx=node.x+dx[i];
		int	newy=node.y+dy[i];
		int	newz=node.z+dz[i];
			if(check(newx,newy,newz)) continue;//不符合就跳过 
			vist[newx][newy][newz]=1;//标记已经到达过 
			q.push(dian{newx,newy,newz,node.step+1});//压入新的点 
		}
	} 
	
}
int main()
{
	int i,j,k;
	int si,sj,sk;
	while(cin>>L>>R>>C){
		if(L==0||R==0||C==0) break; 
	memset(vist,0,sizeof(vist));
	for(i=1;i<=L;i++){
		for(j=1;j<=R;j++){
			getchar();//吸收换行 
			for(k=1;k<=C;k++){
				scanf("%c",&e[i][j][k]);
				if(e[i][j][k]=='S'){//记录起点坐标 
					si=i,sj=j,sk=k;
				}
				if(e[i][j][k]=='E'){//记录终点坐标 
					ei=i,ej=j,ek=k;
				}
			}
		}
			getchar();//吸收换行 
	}
	/*for(i=1;i<=L;i++){//输出地图,看看是否正确 
		for(j=1;j<=R;j++){
			for(k=1;k<=C;k++){
				printf("%c",e[i][j][k]); 
			}
			printf("\n");
		}
	}*/
	flag=0;
	bfs(si,sj,sk);
	if(flag){
		printf("Escaped in %d minute(s).\n",time);
	}
	else printf("Trapped!\n");
	
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值