【poj 2251】 Dungeon Master 题意&题解&代码(C++)

题目链接:
http://poj.org/problem?id=2251
题意:
题目大意:这题是一个三维的迷宫题目,其中用’.’表示空地,’#’表示障碍物,’S’表示起点,’E’表示终点,求从起点到终点的最小移动次数,解法和二维的类似,只是在行动时除了东南西北移动外还多了上下。
题解:
恶心的bfs搜最短路,从二位平面拓展到三维立体,其实也只需要把原本的二位方向数组改为三维即可。。。
代码:

迷之wa

nclude
#include
#include
#include
#include
using namespace std;
char c[35];
int flag,opx,opy,oph,edx,edy,edh,n,m,h,f[35][35][35],dis[35][35][35];
struct node{
    int x;int y;int z;
};
int de[3][6]={{1,-1,0, 0,0, 0},
          {0, 0,1,-1,0, 0},
          {0, 0,0, 0,1,-1}};
queueq;
void bfs()
{
    node st;
    flag=0;
    st.x=opx;st.y=opy;st.z=oph;
    q.push(st);
    dis[oph][opx][opy]=0;
    while(!q.empty() && flag==0)
    {
        node now=q.front();q.pop(); 
        int nox=now.x;
        int noy=now.y;
        int noz=now.z;
        for (int i=0;i<6;i++)
        {
            int nex=nox+de[0][i];
            int ney=noy+de[1][i];
            int nez=noz+de[2][i];
            if (nex>=1 && nex<=m && ney>=1 && ney<=n && nez>=1 && nez<=h)
            {
                if (dis[nez][nex][ney]==-1&&f[nez][nex][ney]==0)
                {
                    node ne;
                    ne.x=nex;ne.y=ney;ne.z=nez;
                    dis[nez][nex][ney]=dis[noz][nox][noy]+1;
                    q.push(ne);
                }
            }
            if (edx==nex && edy==ney && edh==nez)
            {
                flag=1;return ;
            }
        }
    }
}
int main()
{
    while(scanf("%d%d%d",&h,&n,&m))
    {
        if (n==0&&m==0&&h==0)   return 0;
        memset(dis,-1,sizeof(dis));
        while(!q.empty()) q.pop();
        for (int k=1;k<=h;k++)
        for (int i=1;i<=n;i++)
        {
            scanf("%s",c);
            for (int j=1;j<=m;j++)
            {
                if (c[j-1]=='S')
                opx=j,opy=i,oph=k;
                else if (c[j-1]=='#')
                f[k][j][i]=1;
                else if (c[j-1]=='E')
                edx=j,edy=i,edh=k;
            }
        }
        bfs();
        if (flag) printf("Escaped in %d minute(s).\n",dis[edh][edx][edy]); 
        else printf("Trapped!\n");
    }
}

你可能感兴趣的:(oi之路,poj)