nyoj353 3D dungeon

首先是广搜版 这个通过了测试 并且没有超时

/*
	A - 地下城主
描述
你被困在一个3 d地牢和需要找到最快的方法! 单位立方体的地牢由可
能是也可能不是充满了摇滚。 移动一个单位需要一分钟北部,南部,东
部,西部,向上或向下。 你不能移动对角和迷宫周围是坚硬的岩石。可
能是一种逃避? 如果是,要多长时间?

输入
输入由一个地牢。 每个地牢描述开头一行包含三个整数L R和C(所有大
小限制在30)。L是水平占地牢的数量。R和C的行数和列在每个层次的计划。
然后将遵循L R线每个块包含C字符。 每个字符描述了地牢里的一个细胞。 
细胞完整的岩石是由一个“#”表示和空细胞是由一个“。”表示。 你的
起始位置是由“年代”,表示退出由字母“E”。 每个层次有一个空行后。
输入终止三0 L R和C。

输出
每个迷宫生成一行输出。 如果可以达到出口,打印一行的形式逃在x分钟(s)。 
其中x是取而代之的是最短的时间逃跑。
如果它是不可能逃脱,打印被困! 

样例输入

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

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

样例输出

Escaped in 11 minute(s).
Trapped!

*/

#include 
#include 
#include 
using namespace std;
char map[35][35][35];
int visit[35][35][35];
int L,R,C;
struct Node
{
	int x,y,z,t;
};
queue Q;
Node D;
void add(int l,int r,int c,int time)
{
	D.x=l;D.y=r;D.z=c+1;
	if(map[D.x][D.y][D.z]!='#'&&visit[D.x][D.y][D.z]==0)
	{
		D.t=time+1;
		Q.push(D);
	}
	D.x=l;D.y=r+1;D.z=c;
	if(map[D.x][D.y][D.z]!='#'&&visit[D.x][D.y][D.z]==0)
	{
		D.t=time+1;
		Q.push(D);
	}
	D.x=l+1;D.y=r;D.z=c;
	if(map[D.x][D.y][D.z]!='#'&&visit[D.x][D.y][D.z]==0)
	{
		D.t=time+1;
		Q.push(D);
	}
	D.x=l;D.y=r;D.z=c-1;
	if(map[D.x][D.y][D.z]!='#'&&visit[D.x][D.y][D.z]==0)
	{
		D.t=time+1;
		Q.push(D);
	}
	D.x=l;D.y=r-1;D.z=c;
	if(map[D.x][D.y][D.z]!='#'&&visit[D.x][D.y][D.z]==0)
	{
		D.t=time+1;
		Q.push(D);
	}
	D.x=l-1;D.y=r;D.z=c;
	if(map[D.x][D.y][D.z]!='#'&&visit[D.x][D.y][D.z]==0)
	{
		D.t=time+1;
		Q.push(D);
	}
}
int dfs(int x,int y,int z)
{

	while(!Q.empty())
	{
		D=Q.front();
		Q.pop();
		x=D.x;
		y=D.y;
		z=D.z;
		if(map[x][y][z]=='E')
			return D.t;
		else if(map[x][y][z]=='S')
		{
			visit[x][y][z]=1;
			add(x,y,z,0);
		}
		else if(map[x][y][z]=='.'&&visit[x][y][z]==0)
		{
			visit[x][y][z]=1;
			add(x,y,z,D.t);
		}
	}
	return -1;
}
int main()
{
	while(~scanf("%d%d%d",&L,&R,&C) && L && R && C)
	{
		memset(map,'#',sizeof(map));//边界用墙来做  
		memset(visit,0,sizeof(visit));
		int i,j,k;
		for(k=1;k<=L;k++)
		{
			getchar();
			for(i=1;i<=R;i++)
			{
				for(j=1;j<=C;j++)
				{
					scanf("%c",&map[k][i][j]);
					if(map[k][i][j]=='S')
					{
						D.x=k;
						D.y=i;
						D.z=j;
						//D.t=0;
						Q.push(D);
					}
				}
				getchar();
			}
		}
		int ans=dfs(D.x,D.y,D.z);
		while(!Q.empty())
		{
			Q.pop();
		}
		if(ans!=-1)
		{
			printf("Escaped in %d minute(s).\n",ans);
		}
		else
		{
			printf("Trapped!\n");
		}
	}
	return 0; 
}

接下来的是深搜版 这个测试数据通过了 就是超时

#include 
#include 
#define INF 0x3f3f3f 
int l,r,c,book[30][30][30],num=0,time;//time存储最后最短的时间 
char ave[30][30][30];
void fun(int a,int b,int d)
{
	if(a>=l||b>=r||d>=c||a<0||b<0||d<0)
	{
		return ;
	}
	if(ave[a][b][d]=='#'||book[a][b][d]==1)
	{
		return ;
	}
	if(ave[a][b][d]=='E')
	{
		if(time>num)
		{
			time=num; 
		} 
		return ;
	}
	else
	{
		num++;
		book[a][b][d]=1;
		fun(a+1,b,d);
		fun(a-1,b,d);
		fun(a,b+1,d);
		fun(a,b-1,d);
		fun(a,b,d+1);
		fun(a,b,d-1);
		book[a][b][d]=0;
		num--;
	}
}
int main()
{
	while(scanf("%d%d%d",&l,&r,&c)&&l!=0&&r!=0&&c!=0)
	{
		int i,j,k;
		for(i=0;i


你可能感兴趣的:(程序,搜索,深搜,广搜)