POJ-2251-Dungeon Master
http://poj.org/problem?id=2251
基本的三维BFS,用队列写的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
int n1,n2,n3;
char map[40][40][40];
int visit[40][40][40];
int dir[6][3]={{1,0,0},{-1,0,0},{0,-1,0},{0,1,0},{0,0,-1},{0,0,1}};
struct node
{
int x;
int y;
int z;
int time;
};
int go(int x,int y,int z)
{
if(0<=x&&x<n1&&0<=y&&y<n2&&0<=z&&z<n3&&map[x][y][z]=='.')
return 1;
return 0;
}
int bfs(node s1,node s2)
{
int i;
queue<node>q;
node st,ed;
st.x=s1.x;
st.y=s1.y;
st.z=s1.z;
st.time=0;
memset(visit,0,sizeof(visit));
visit[st.x][st.y][st.z]=1;
map[s2.x][s2.y][s2.z]='.';
q.push(st);
while(!q.empty())
{
st=q.front();
q.pop();
if(st.x==s2.x&&st.y==s2.y&&st.z==s2.z)
return st.time;
for(i=0;i<6;i++)
{
ed.x=st.x+dir[i][0];
ed.y=st.y+dir[i][1];
ed.z=st.z+dir[i][2];
if(!visit[ed.x][ed.y][ed.z]&&go(ed.x,ed.y,ed.z))
{
ed.time=st.time+1;
visit[ed.x][ed.y][ed.z]=1;
q.push(ed);
}
}
}
return -1;
}
int main()
{
node st,ed;
int i,j,k,ans;
while(scanf("%d%d%d",&n1,&n2,&n3),n1||n2||n3)
{
for(i=0;i<n1;i++)
{
getchar();
for(j=0;j<n2;j++)
scanf("%s",map[i][j]);
}
for(i=0;i<n1;i++)
for(j=0;j<n2;j++)
for(k=0;k<n3;k++)
{
if(map[i][j][k]=='S')
{
st.x=i;
st.y=j;
st.z=k;
}
else if(map[i][j][k]=='E')
{
ed.x=i;
ed.y=j;
ed.z=k;
}
}
ans=bfs(st,ed);
if(ans==-1)
printf("Trapped!\n");
else
printf("Escaped in %d minute(s).\n",ans);
}
return 0;
}