这道题目真心不难,只是最简单的bfs,这个迷宫是放在3维空间里的,走迷宫时只需多加两个方向。
思路是找到迷宫入口,开始bfs,找到出口就记录最少步数,没找到就输出Trapped。
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 15409 | Accepted: 5960 |
Description
Input
Output
Escaped in x minute(s).
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
以下是代码:希望大神指点。
#include<stdio.h>
#include<string.h>
int l,r,c,ans,vis[35][35][35];
char mat[35][35][35];
int dh[6]={1,-1,0,0,0,0};
int dx[6]={0,0,0,0,1,-1};
int dy[6]={0,0,-1,1,0,0};
struct C
{
int h,x,y,step;
}q[10010];
int bfs(int h,int x,int y)
{
int front=0,rear=0;
q[rear].h=h;
q[rear].x=x;
q[rear].y=y;
q[rear++].step=0;
vis[h][x][y]=1;
while(front<rear)
{
for(int i=0;i<6;i++)
{
int nh=q[front].h+dh[i];
int nx=q[front].x+dx[i];
int ny=q[front].y+dy[i];
if(!vis[nh][nx][ny] && mat[nh][nx][ny]!=‘#‘)
{
vis[nh][nx][ny]=1;
q[rear].h=nh;
q[rear].x=nx;
q[rear].y=ny;
q[rear].step=q[front].step+1;
if(mat[nh][nx][ny] == ‘E‘)
{
ans=q[rear].step;
return 1;
}
rear++;
}
}
front++;
}
return 0;
}
int main()
{
while(~scanf("%d %d %d%*c",&l,&r,&c) && l+r+c)
{
memset(mat,‘#‘,sizeof(mat));
memset(vis,0,sizeof(vis));
int i,j,k,ok=0;
for(i=1;i<=l;i++)
{
for(j=1;j<=r;j++)
{
for(k=1;k<=c;k++)
scanf("%c",&mat[i][j][k]);
getchar();
}
getchar();
}
for(i=1;i<=l;i++)
{
for(j=1;j<=r;j++)
{
for(k=1;k<=c;k++)
if(mat[i][j][k]==‘S‘)
{
ok=1;
break;
}
if(ok) break;
}
if(ok) break;
}
ans=0;
if(bfs(i,j,k)) printf("Escaped in %d minute(s).\n",ans);
else printf("Trapped!\n");
}
return 0;
}
POJ 2251 Dungeon Master,布布扣,bubuko.com
原文:http://blog.csdn.net/u013923947/article/details/21875871