zju 1940 Dungeon Master(三维BFS暴搜题)

刚开始

memset(map,'#',sizeof(map));
memset(mins,-1,sizeof(map));初始化错了。导致一直WA,草。。。

不过改过来以后,瞬间0MS跑过。。。哎,自己还是太弱了,

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

#define MAX_N 35
typedef struct p{
	int x,y,z;
}p;

char map[MAX_N][MAX_N][MAX_N];
int l,n,m,mins[MAX_N][MAX_N][MAX_N];
int step[18]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
p s,e;

void Init(){

	memset(map,'#',sizeof(map));
	memset(mins,-1,sizeof(mins));

	for(int i=1;i<=l;i++){

		for(int j=1;j<=n;j++){

			cin>>(map[i][j]+1);

			for(int k=1;k<=m;k++){

				if(map[i][j][k]=='S')
					s.z=i,s.x=j,s.y=k;
				if(map[i][j][k]=='E')
					e.z=i,e.x=j,e.y=k;
			}
		}
	}
}
void putstruct(p u){
	cout<<"Z : "<<u.z<<" X : "<<u.x<<" Y : "<<u.y<<endl;
}
void bfs(){
	
	queue<p> q;
	q.push(s);
	mins[s.z][s.x][s.y]=0;
	while(!q.empty()){

		p t=q.front();
		q.pop();

		for(int i=0;i<18;i+=3){
			p d;
			d.z=t.z+step[i];
			d.x=t.x+step[i+1];
			d.y=t.y+step[i+2];
		//	putstruct(d);
			if(map[d.z][d.x][d.y]=='#'|| mins[d.z][d.x][d.y]>=0 ) 
				continue;

			mins[d.z][d.x][d.y]=mins[t.z][t.x][t.y]+1;
		//	cout<<mins[d.z][d.x][d.y]<<endl;
			q.push(d);
			if(d.x==e.x && d.y==e.y && d.z==e.z)
				return ;
		}
	}


}
void output(){
	for(int i=1;i<=l;i++,cout<<endl)
		for(int j=1;j<=n;j++,cout<<endl)
			for(int k=1;k<=m;k++)
				cout<<mins[i][j][k]<<" ";
}
void outmap(){
	for(int i=1;i<=l;i++,cout<<endl)
		for(int j=1;j<=n;j++,cout<<endl)
			for(int k=1;k<=m;k++)
				cout<<map[i][j][k]<<" ";
}
int main(){

	while(cin>>l>>n>>m && n && l && m){
		Init();
	//	outmap();
		bfs();
	//	output();
		if(mins[e.z][e.x][e.y]<0)
			cout<<"Trapped!"<<endl;
		else{
	//		if(mins[e.z][e.x][e.y]==1)
		//		cout<<"Escaped in "<<mins[e.z][e.x][e.y]<<" minute."<<endl;
	//		else
				cout<<"Escaped in "<<mins[e.z][e.x][e.y]<<" minute(s)."<<endl;
		}		
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值