Dungeon Master
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 48826 | Accepted: 18436 |
Description
Is an escape possible? If yes, how long will it take?
Input
L is the number of levels making up the dungeon.
R and C are the number of rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a ‘#’ and empty cells are represented by a ‘.’. Your starting position is indicated by ‘S’ and the exit by the letter ‘E’. There’s a single blank line after each level. Input is terminated by three zeroes for L, R and C.
Output
Escaped in x minute(s).
where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line
Trapped!
Sample Input
3 4 5 S.... .###. .##.. ###.# ##### ##### ##.## ##... ##### ##### #.### ####E 1 3 3 S## #E# ### 0 0 0
Sample Output
Escaped in 11 minute(s). Trapped!
Source
—– 虽然搜索的是三维的物体,但是是方向只有6个,也很简单。。。 没啥说的,一切尽在代码中 ——#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 33;
char str[MAXN][MAXN][MAXN];
bool vis[MAXN][MAXN][MAXN];
int sx,sy,sz,L,R,C;
int d[6][3]={1,0,0, -1,0,0, 0,1,0, 0,-1,0, 0,0,1, 0,0,-1};
struct node{
int x,y,z,step;
node(){};
node(int _x,int _y,int _z,int _step)
{
x=_x; y=_y; z=_z; step=_step;
}
bool operator < (const node &b)const
{
return step>b.step;
}
};
int bfs(int x,int y,int z)
{
memset(vis,0,sizeof(vis));
vis[z][x][y]=1;
int ans=-1;
priority_queue<node> que;
que.push(node(x,y,z,0));
node e1,e2;
while(que.size())
{
e1=que.top();que.pop();
if(str[e1.z][e1.x][e1.y]=='E')
{
ans=e1.step;
break;
}
for(int i=0;i<6;i++)
{
e2.x=e1.x+d[i][0];
e2.y=e1.y+d[i][1];
e2.z=e1.z+d[i][2];
e2.step=e1.step+1;
if(!vis[e2.z][e2.x][e2.y] && str[e2.z][e2.x][e2.y]!='#' && 0 <= e2.z && e2.z < L && 0 <= e2.x && e2.x < R && 0 <= e2.y && e2.y < C)
{
vis[e2.z][e2.x][e2.y]=1;
que.push(e2);
}
}
}
return ans;
}
int main()
{
while(~scanf("%d %d %d",&L,&R,&C)&&(L|R|C))
{
for(int k=0;k<L;k++)
for(int i=0;i<R;i++)
scanf("%s",str[k][i]);
int z=0;
for(int k=0;k<L;k++)
{
if(z) break;
for(int i=0;i<R;i++)
{
if(z) break;
for(int j=0;j<C;j++)
if(str[k][i][j]=='S')
{
sx=i;
sy=j;
sz=k;
z=1;
break;
}
}
}
int ans=bfs(sx,sy,sz);
if(ans==-1) puts("Trapped!");
else printf("Escaped in %d minute(s).\n",ans);
}
return 0;
}
198



被折叠的 条评论
为什么被折叠?



