poj2251


<span style="font-size:14px;">  <span style="color: rgb(255, 102, 102);">转载请注明出处:</span></span><a target=_blank href="http://blog.csdn.net/wangjian8006"><span style="font-size: 14px;">http://blog.csdn.net/wangjian8006</span></a><span style="font-size: 14px;"></span><p> </p><p>题目大意:</p><p>              一个立体空间, 输入三个数,L,R,C,代表有L个平面,R行,C列,.代表可以走,#代表不能走,S代表开始点,E代表结束点,问从S开始走,对每个位置,有六个走法,即空间的六个方向的走法(上下东南西北),一分钟可以走一个点,问从S走到E点,最少可以经过多少分钟,若不能到达,则输出Trapped!</p><p>解题思路:</p><p>             可以用空间的公式的分解与组合来做,但是容易出错,所以 用三维数组模拟空间立体,用作于BFS来搜索</p><p>代码:</p>
#include <iostream>
using namespace std;

struct q{
	int x,y,z;
}q[30000];
int length[30000];
int xx[]={1,-1,0,0,0,0};
int yy[]={0,0,0,0,-1,1};
int zz[]={0,0,-1,1,0,0};
bool dis[40][40][40];
char map[40][40][40];
int l,r,c,sx,sy,sz;

int bfs(){
	int rear,front,dx,dy,dz,i;
	memset(dis,false,sizeof(dis));
	memset(length,0,sizeof(length));
	
	q[0].x=sx,q[0].y=sy,q[0].z=sz;
	front=rear=0;
	while(front<=rear){
		for(i=0;i<6;i++){
			dx=q[front].x+xx[i];
			dy=q[front].y+yy[i];
			dz=q[front].z+zz[i];
			if(!dis[dx][dy][dz] && (map[dx][dy][dz]=='.' || map[dx][dy][dz]=='E') && dx>=0 && dx<l && dy>=0 && dy<r && dz>=0 && dz<c)
			{
				dis[dx][dy][dz]=true;
				q[++rear].x=dx;
				q[rear].y=dy;
				q[rear].z=dz;
				length[rear]=length[front]+1;
				if(map[dx][dy][dz]=='E') return length[rear];
			}
		}
		front++;
	}
	return 0;
}

int main(){
	int i,j,k,key;
	while(scanf("%d%d%d\n",&l,&r,&c)){
		if(l==0 && r==0 && c==0) break;
		
		for(i=0;i<l;i++,getchar())
			for(j=0;j<r;j++,getchar())
				for(k=0;k<c;k++){
					scanf("%c",&map[i][j][k]);
					if(map[i][j][k]=='S') sx=i,sy=j,sz=k;
				}
		key=bfs();
		if(key)	printf("Escaped in %d minute(s).\n",key);
		else printf("Trapped!\n");
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值