POJ 2251-Dungeon Master (三维BFS)

版权声明:版权归Ordinarv所有 https://blog.csdn.net/ordinarv/article/details/82178655

分析

三维BFS即可,只能上下东西南北6个方向走。

注意不只是‘.’可以走‘E’也可以,就是保证不越界的情况下除了‘#’都可以走

vis忘memset wa了一发。


AC Code

#include<iostream>
#include<cstdio>
#include<queue>
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=30+5;
using namespace std;
int l,r,c;
int sz,sx,sy;
int dz[]={0,0,0,0,1,-1},dx[]={1,-1,0,0,0,0},dy[]={0,0,1,-1,0,0};
char mp[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
struct node{
	int x,y,z,level;
};
bool judge(node &tar){
	if(mp[tar.z][tar.x][tar.y]=='E') return 1;
	return 0;
}
bool ise(node &tar){
	if(tar.z>=0&&tar.z<l&&tar.x>=0&&tar.x<r&&tar.y>=0&&tar.y<c) return 1;
	return 0;
}
int bfs(){
	queue<node> q;
	node cur,next;
	cur.z=sz;
	cur.x=sx;
	cur.y=sy;
	cur.level=0;
	memset(vis,0,sizeof(vis));
	vis[cur.z][cur.x][cur.y]=1;
	q.push(cur);
	while(!q.empty()){
		cur=q.front();
		q.pop();
		for(int i=0;i<6;i++){
			next.z=cur.z+dz[i];
			next.x=cur.x+dx[i];
			next.y=cur.y+dy[i];
			if(ise(next)&&mp[next.z][next.x][next.y]!='#'&&!vis[next.z][next.x][next.y]){
				next.level=cur.level+1;
				vis[next.z][next.x][next.y]=1;
				q.push(next);
			}
			if(judge(next)){
				return next.level;
			}
		}		
	}
	return -1;	
}
int main(){
	while(~scanf("%d%d%d",&l,&r,&c)&&l+r+c){
		
		for(int i=0;i<l;i++){
			for(int j=0;j<r;j++){
				scanf("%s",mp[i][j]);
				for(int k=0;k<c;k++){
					if(mp[i][j][k]=='S'){
						sz=i;sx=j;sy=k;
					}					
				}
			}
		}
		int ans=bfs();
		if(ans==-1)printf("Trapped!\n");
		else printf("Escaped in %d minute(s).\n",ans);
	}	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ordinarv/article/details/82178655
今日推荐