三维bfs

地牢师父
时限:1000 MS 内存限制:65536K
提交材料共计: 23774 接受: 9248
描述

你被困在一个3D地牢,需要找到最快的出路!地牢由单位立方体组成,这些立方体可以填充岩石,也可以不填充岩石。向北、南、东、西、上或下移动一个单位需要一分钟。你不能对角移动,迷宫四周都是坚硬的岩石。

逃跑是可能的吗?如果是,需要多长时间?
输入

输入由若干地牢组成。每个地牢描述从包含三个整数L、R和C的一行开始(都限制在30个大小)。
我是组成地牢的等级数。
R和C是构成每个级别计划的行数和列数。
然后将跟随L个R行块,每一行都包含C字符。每个字符描述地牢的一个单元格。充满岩石的单元格由“#”表示,空单元格由“.”表示。你的起始位置用“S”表示,出口用字母“E”表示。在每个级别之后有一个空行。对于L、R和C,输入由三个零终止。
输出量

每个迷宫产生一行输出。如果可能到达出口,请打印表单的一行。
在x分钟内逃走了。

其中x被最短的逃逸时间所代替。
如果无法转义,请打印行
被困住了!
样本输入

3 4 5
S…
.###.
.##…
###.#

##.##
##…

#.###
####E

1 3 3
S##
#E#

0 0 0
样本输出

Escaped in 11 minute(s).
Trapped!
代码:

#include <iostream>
#include <cstdio>
#include <cstring>
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()
{
	//freopen("input.txt", "r", stdin);
	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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值