poj 2251 Dungeon Master

题意:给出一个3D迷宫,要求从起点到终点的最少步数。

思路:其实跟二维的迷宫一样,只要进行一次BFS即可。。


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

struct Node{
	int x,y,z;
	int step;
	bool operator == (const Node& cmp)const{
		return z==cmp.z&&x==cmp.x&&y==cmp.y;
	}
}s,e;

const int maxn=35;
char dung[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
int L,R,C;
int dir[][3]={{-1,0,0},{1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
Node queue[1000000];
int front,rear;

bool ok(Node tmp){
	return tmp.z>=0&&tmp.z<L&&tmp.x>=0&&tmp.x<R&&tmp.y>=0&&tmp.y<C&&dung[tmp.z][tmp.x][tmp.y]!='#';
}

int bfs(){
	front=rear=0;
	queue[rear++]=s;
	while(front<rear){
		Node first=queue[front++];
		for(int i=0;i<6;i++){
			Node tmp;
			tmp.z=first.z+dir[i][0],tmp.x=first.x+dir[i][1],tmp.y=first.y+dir[i][2];
			tmp.step=first.step+1;
			if(ok(tmp) && !vis[tmp.z][tmp.x][tmp.y]){
				if(tmp==e)return tmp.step;
				vis[tmp.z][tmp.x][tmp.y]=true;
				queue[rear++]=tmp;
			}
		}
	}
	return -1;
}

int main(){
	while(scanf("%d%d%d",&L,&R,&C)&&(L||R||C)){
		for(int k=0;k<L;k++){
			for(int i=0;i<R;i++){
				for(int j=0;j<C;j++){
					scanf(" %c",&dung[k][i][j]);
					if(dung[k][i][j]=='S'){s.z=k;s.x=i;s.y=j;s.step=0;}
					if(dung[k][i][j]=='E'){e.z=k;e.x=i;e.y=j;}
				}
			}
		}
		memset(vis,false,sizeof(vis));
		int ans=bfs();
		if(ans==-1)puts("Trapped!");
		else printf("Escaped in %d minute(s).\n",ans);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值