poj 2251:Dungeon Master

这又是一道bfs的题。有一个给定长、宽、高的三维迷宫,给定起点与终点,每走一步花费1分钟,若可以出去则输出最短时间,否则输出“Trapped!”。其中起点为‘S’,终点为‘E’,墙为‘#’,路为‘.’。

 

直接bfs,没什么好说的。


#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
using namespace std;

typedef struct Way{
	int x,y,z;
	int step;
}Way;

bool Dung[35][35][35]={0};
queue <Way> g;

int main(){
	int L,R,C;
	while(scanf("%d%d%d",&L,&R,&C) && L+R+C!=0){
		memset(Dung,0,sizeof(Dung));
		int eI,eJ,eK;
        bool flag=0;
		Way a,b;
		for(int i=0;i<L;i++){
			for(int j=0;j<R;j++){
				for(int k=0;k<C;k++){
					char cell;
					cin>>cell;
					if(cell=='#') Dung[i][j][k]=1;
					else if(cell=='S'){
						Dung[i][j][k]=1;
						a.x=i;a.y=j;a.z=k;a.step=0;
					}
					else if(cell=='E'){
						eI=i;eJ=j;eK=k;
					}
				}
			}
		}
		g.push(a);
		while(!g.empty()){
			a=g.front();g.pop();

			if(a.x==eI && a.y==eJ && a.z==eK){
				flag=1;break;
			}

			if(a.x+1<L && !Dung[a.x+1][a.y][a.z]){
				b.x=a.x+1;b.y=a.y;b.z=a.z;b.step=a.step+1;
				Dung[a.x+1][a.y][a.z]=1;
				g.push(b);
			}

			if(a.x-1>=0 && !Dung[a.x-1][a.y][a.z]){
				b.x=a.x-1;b.y=a.y;b.z=a.z;b.step=a.step+1;
				Dung[a.x-1][a.y][a.z]=1;
				g.push(b);
			}

			if(a.y+1<R && !Dung[a.x][a.y+1][a.z]){
				b.x=a.x;b.y=a.y+1;b.z=a.z;b.step=a.step+1;
				Dung[a.x][a.y+1][a.z]=1;
				g.push(b);
			}

			if(a.y-1>=0 && !Dung[a.x][a.y-1][a.z]){
				b.x=a.x;b.y=a.y-1;b.z=a.z;b.step=a.step+1;
				Dung[a.x][a.y-1][a.z]=1;
				g.push(b);
			}

			if(a.z+1<C && !Dung[a.x][a.y][a.z+1]){
				b.x=a.x;b.y=a.y;b.z=a.z+1;b.step=a.step+1;
				Dung[a.x][a.y][a.z+1]=1;
				g.push(b);
			}

			if(a.z-1>=0 && !Dung[a.x][a.y][a.z-1]){
				b.x=a.x;b.y=a.y;b.z=a.z-1;b.step=a.step+1;
				Dung[a.x][a.y][a.z-1]=1;
				g.push(b);
			}
		}
		if(flag){
			printf("Escaped in %d minute(s).\n",a.step);
		}
		else cout<<"Trapped!"<<endl;
        for(;!g.empty();g.pop());
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值