您的位置:首页 > 其它

POJ-2251-Dungeon Master

2013-02-17 13:35 253 查看
这个题仍然属于一个BFS的题,尽管书中说用DFS作,但我仍觉得BFS比较好做。

大意是说给你一个三维的迷宫,第一个代表第一层,第二个代表第二层,第三个代表第三层,问从起点(S)到终点(E)最快需要走多少步。

我的处理方法呢,人为设置第0层和第四层,即为第1层的上一层和第3层的下一层,然后再人为给每一层加一个'#'的围栏,这样也就是说我们在后面不需要处理相应的边界问题。

处理好以后就比较简单了,跟以往一样,直接上代码。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#define MAX 33
using namespace std;
int l,r,c,map[MAX][MAX][MAX],use[MAX][MAX][MAX];
int sx,sy,sz,ex,ey,ez,movex[6]={1,-1,0,0,0,0},movey[6]={0,0,1,-1,0,0},movez[6]={0,0,0,0,1,-1};
int main()
{
while(scanf("%d%d%d",&l,&r,&c)!=EOF)
{
if(l+r+c==0)
break;
memset(use,0,sizeof(use));
for(int i=0;i<=r+1;i++)
for(int j=0;j<=c+1;j++)
map[0][i][j]=map[l+1][i][j]='#';
for(int i=1;i<=l;i++)
{
for(int j=0;j<=r+1;j++)
map[i][j][0]=map[i][j][c+1]='#';
for(int j=0;j<=c+1;j++)
map[i][0][j]=map[i][r+1][j]='#';
for(int j=1;j<=r;j++)
{
getchar();
for(int k=1;k<=c;k++)
{
scanf("%c",&map[i][j][k]);
if(map[i][j][k]=='S')
sx=j,sy=k,sz=i;
else if(map[i][j][k]=='E')
ex=j,ey=k,ez=i;
}
}
getchar();
}
queue<int> x,y,z;
x.push(sx);
y.push(sy);
z.push(sz);
use[sz][sx][sy]=1;
int flag=0,ans=0,lastcou=1,nxtcou=0,cou=0;
while(!x.empty())
{
int itx=x.front();
x.pop();
int ity=y.front();
y.pop();
int itz=z.front();
z.pop();
for(int i=0;i<6;i++)
{
int xx=itx+movex[i];
int yy=ity+movey[i];
int zz=itz+movez[i];
if(map[zz][xx][yy]=='#'||use[zz][xx][yy])
continue;
if(xx==ex&&yy==ey&&zz==ez)
{
flag=1;
break;
}
x.push(xx);
y.push(yy);
z.push(zz);
use[zz][xx][yy]=1;
nxtcou++;
}
if(flag)
{
while(!x.empty())
x.pop(),y.pop(),z.pop();
break;
}
cou++;
if(cou==lastcou)
{
lastcou=nxtcou;
ans++;
cou=0;
nxtcou=0;
}
}
if(flag)
printf("Escaped in %d minute(s).\n",ans+1);
else
printf("Trapped!\n");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: