标签:
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 17444 | Accepted: 6790 |
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!
题意:某动物被困在三维的地下城里,起点是S,终点是E问他能不能逃跑,能逃最快需要几分钟。
思路:简单的bfs,三维就是二维的小升级,所以nxt数组要加一个上下移动的步骤,三维map即可
//272K 32MS
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int l,r,c,flag;
char mapp[35][35][35];
bool book[35][35][35];
struct point{
int z;
int x;
int y;
int t;
};
int nx[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}; //加两个上下移动的操作
queue<point> que;
point s;
void ini()
{
flag=0;
memset(mapp,-1,sizeof(mapp));//把mapp初始化成-1,图的外界部分都是小于0的数所以判断边界就变得简单了
memset(book,0,sizeof(book));
for(int k=1;k<=l;k++){
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
scanf("%c",&mapp[k][i][j]);
if(mapp[k][i][j]=='S')
s.z=k,s.x=i,s.y=j,s.t=0;
}
getchar(); //对这种字符的读入要格外注意换行符的读入问题
}
getchar();
}
while(!que.empty()) que.pop();
}
void bfs()
{
que.push(s);
book[s.z][s.x][s.y]=1;
while(!que.empty()){
point tmp=que.front();
que.pop();
if(mapp[tmp.z][tmp.x][tmp.y]=='E'){flag=1;printf("Escaped in %d minute(s).\n",tmp.t);return;}
point nxt;int a,b,c;
for(int i=0;i<6;i++){
a=tmp.z+nx[i][0],b=tmp.x+nx[i][1],c=tmp.y+nx[i][2];
if(mapp[a][b][c]<0||mapp[a][b][c]=='#'||book[a][b][c]) continue;
nxt.z=a,nxt.x=b,nxt.y=c,nxt.t=tmp.t+1;
que.push(nxt);
book[a][b][c]=1;
}
}
}
int main()
{
while(~scanf("%d%d%d",&l,&r,&c)&&(l||r||c)){
getchar();
ini();
bfs();
if(!flag) printf("Trapped!\n");
}
return 0;
}
POJ2251Dungeon Master(三维图)(BFS)
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/42979885