https://vjudge.net/problem/POJ-2251
Dungeon Master POJ - 2251
一个裸的三维bfs,其实和二维差不了多少
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<algorithm>
using namespace std;
int n1,n2,n3;
int visit[40][40][40];
char a[40][40][40];
int nextt[6][3]= {{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
int x,y,z,step;
};
int go(int x,int y,int z)
{ //判断下一个是否超出图的边界
if(0<=x&&x<n1&&0<=y&&y<n2&&0<=z&&z<n3&&a[x][y][z]=='.')
return 1;
return 0;
}
int bfs(node s1,node s2)
{
queue<node>q; //直接
node st,ed; //st记录现在的,ed记录下一个
st.x=s1.x;
st.y=s1.y;
st.z=s1.z;
st.step=0;
memset(visit,0,sizeof(visit));
visit[st.x][st.y][st.z]=1;
a[s2.x][s2.y][s2.z]='.'; //因为要遍历到这个出口点,所以把它设为'.',
q.push(st); //比较方便,后面不有单独if了
while(!q.empty())
{
st=q.front(); //拿出队列第一个
q.pop(); //弹出队列第一个
if(st.x==s2.x&&st.y==s2.y&&st.z==s2.z)
return st.step; //因为是找最短的
//bfs,最先遍历到,就是最短的,所以直接输出
//比dfs简单
for(int i=0; i<6; i++)
{
ed.x=st.x+nextt[i][0];
ed.y=st.y+nextt[i][1];
ed.z=st.z+nextt[i][2];
if(!visit[ed.x][ed.y][ed.z]&&go(ed.x,ed.y,ed.z))
{
ed.step=st.step+1; //等于上一步加1
visit[ed.x][ed.y][ed.z]=1;
q.push(ed); //入列
}
}
}
return -1; //找不到就返回-1
}
int main()
{
while(scanf("%d%d%d",&n1,&n2,&n3),n1||n2||n3)
{
node st,en;
for(int i=0; i<n1; i++)
{
getchar();
for(int j=0; j<n2; j++)
{
scanf("%s",a[i][j]);
}
}
for(int i=0; i<n1; i++)
{
for(int j=0; j<n2; j++)
{
for(int k=0; k<n3; k++)
{
if(a[i][j][k]=='S') //记录开始的
{ //点
st.x=i,st.y=j,st.z=k;
}
else if(a[i][j][k]=='E')
{ //记录结束的点
en.x=i,en.y=j,en.z=k;
}
}
}
}
int ans=bfs(st,en);
if(ans==-1)printf("Trapped!\n");
else printf("Escaped in %d minute(s).\n",ans);
}
return 0;
}