首先是广搜版 这个通过了测试 并且没有超时
/*
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