B - Dungeon Master

你被困在一个三维的空间中,现在要寻找最短路径逃生!
空间由立方体单位构成
你每次向上下前后左右移动一个单位需要一分钟
你不能对角线移动并且四周封闭
是否存在逃出生天的可能性?如果存在,则需要多少时间?

Input - 输入

输入第一行是一个数表示空间的数量。
每个空间的描述的第一行为L,R和C(皆不超过30)。
L表示空间的高度。
R和C分别表示每层空间的行与列的大小。
随后L层地牢,每层R行,每行C个字符。
每个字符表示空间的一个单元。’#‘表示不可通过单元,’.‘表示空白单元。你的起始位置在’S’,出口为’E’。
每层空间后都有一个空行。L,R和C均为0时输入结束。

Output - 输出

每个空间对应一行输出。
如果可以逃生,则输出如下
Escaped in x minute(s).
x为最短脱离时间。
如果无法逃生,则输出如下
Trapped!

Sample Input - 输入样例
3 4 5
S…
.###.
.##…
###.#

##.##
##…

#.###
####E

1 3 3
S##
#E#

0 0 0
Sample Output - 输出样例

Escaped in 11 minute(s).
Trapped!

这道题我真的是提交了无数遍,后来才发现分别把那个限定范围改成1到长宽高就可以了,这里是一定要注意的。
代码如下:

#include"iostream"
#include"cstring"
#include"algorithm"
#include"queue"
using namespace std;
struct cmp
{
	int x,y,z;
	int sum;
};
int vst[35][35][35];
char pic[35][35][35];
int dic[6][3]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
int n,m,l;
int xx,yy,zz;
void dfs()
{
	queue<cmp> q;
	cmp r;
	r.x=xx;
	r.y=yy;
	r.z=zz;
	r.sum=0;
	vst[xx][yy][zz]=1;
	q.push(r);
	while(!q.empty())
	{
		cmp e=q.front();
		q.pop();
		int xxx=e.x;
		int yyy=e.y;
		int zzz=e.z;
		int Sum=e.sum;
	    if(pic[xxx][yyy][zzz]=='E')
      	{
	      	cout<<"Escaped in "<<Sum<<" minute(s)."<<endl;
	      	return;
      	}
		for(int i = 0;i < 6;i ++)
     	{
     		cmp h;
	    	int cx=h.x=dic[i][0]+xxx;
	    	int cy=h.y=dic[i][1]+yyy;
	    	int cz=h.z=dic[i][2]+zzz;
	    	h.sum=Sum+1;
	    	if(cx < 1 || cy < 1 || cz < 1 || cx > n || cy > m || cz > l)
	    	{
	    		continue;
			}
	    	if(pic[cx][cy][cz] != '#' && !vst[cx][cy][cz])
         	{
         	   	vst[cx][cy][cz]=1;
         	   	q.push(h);
         	}
    	}
	}
	cout<<"Trapped!"<<endl;
}
int main()
{
	while(cin >> n >> m >> l && (n && m && l))
	{
		for(int j = 1;j <= n;j ++)
		{
	    	for(int i = 1;i <= m;i ++)
	     	{
	     		for(int k = 1;k <= l;k ++)
	     		{
	     			cin >> pic[j][i][k];
	     			if(pic[j][i][k] == 'S')
			    	{
			    		xx=j;
			     		yy=i;
			    		zz=k;
			    	}
				 }
	    	}
		}
		memset(vst,0,sizeof(vst));
		dfs();
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值