信息奥赛一本通 - 1248: Dungeon Master

本文介绍了使用C++编程语言实现的一种基于广度优先搜索(BFS)的迷宫逃脱算法,通过遍历二维数组并标记路径来判断角色能否从起点到达终点。
摘要由CSDN通过智能技术生成
#include<bits/stdc++.h>
using namespace std;
char a[100][100][100];
bool b[100][100][100];
int l,r,c,fx,fy,fz;
int q[100][4],head=0,tail=0;
int wx[6]={-1,+1,00,00,00,00};
int wy[6]={00,00,-1,+1,00,00};
int wz[6]={00,00,00,00,-1,+1};
void bfs(int sx,int sy,int sz){
	tail++;
	q[tail][0]=sx;
	q[tail][1]=sy;
	q[tail][2]=sz;
	while(head<tail){
		head++;
		int x=q[head][0],y=q[head][1],z=q[head][2],s=q[head][3];
		for(int i=0;i<6;i++){
			int nx=x+wx[i],ny=y+wy[i],nz=z+wz[i];
//			cout<<nx<<" "<<ny<<" "<<nz<<endl;
			if(b[nx][ny][nz]==1){
				tail++;
				q[tail][0]=nx;
				q[tail][1]=ny;
				q[tail][2]=nz;
				q[tail][3]=s+1;
				b[nx][ny][nz]=0;
				if(nx==fx&&ny==fy&&nz==fz){
					cout<<"Escaped in "<<q[tail][3]<<" minute(s).";
					cout<<endl;
					return;
				}
			}
		}
	}
	cout<<"Trapped!"<<endl;
	return;
}
int main(){
	while(1){
		cin>>l>>r>>c;
		if(l==0) break;
		int sx,sy,sz;
		memset(a,0,sizeof(a));memset(b,0,sizeof(b));
		memset(q,0,sizeof(q));head=0;tail=0;
		for(int i=1;i<=l;i++){
			for(int j=1;j<=r;j++){
				for(int k=1;k<=c;k++){
					cin>>a[i][j][k];
					if(a[i][j][k]=='.') b[i][j][k]=1;
					else if(a[i][j][k]=='#') b[i][j][k]=0;
					if(a[i][j][k]=='S'){
						sx=i;sy=j;sz=k;
						b[i][j][k]=1;
					}else if(a[i][j][k]=='E'){
						fx=i;fy=j;fz=k;
						b[i][j][k]=1;
					}
				}
			}
		}
//		cout<<sx<<" "<<sy<<" "<<sz<<endl;
//		cout<<fx<<" "<<fy<<" "<<fz<<endl;
		bfs(sx,sy,sz);
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值