POJ2251---Dungeon Master---BFS最短路之三维迷宫

题目链接:http://poj.org/problem?id=2251
题目大意:这个题是BFS的典型模板题,只不过有趣的是它将图形由平面变为了三维立体图形,
自认为难点在输入上,采用三维字符数组,三层循环,最外层循环对应三维数组的第三维表示的就是层数。
具体代码如下:

#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=50;
char map[MAXN][MAXN][MAXN];//三维字符数组
int vis[MAXN][MAXN][MAXN];//标记是否访问过
char str[MAXN];
int dirx[6]={-1,1,0,0,0,0};//可以往6个方向移动
int diry[6]={0,0,-1,1,0,0};
int dirz[6]={0,0,0,0,-1,1};
int xru,yru,zru,xcu,ycu,zcu;//入口和出口的信息
int lev,row,col;
typedef struct Node  //点的信息
{
    int x;
    int y;
    int z;
    int step;
}Node;
queue <Node> Q;
void BFS()
{
    vis[xru][yru][zru]=1;
    Node node,t;
    node.x=xru;
    node.y=yru;
    node.z=zru;
    node.step=0;
    while(!Q.empty())//重要
    {
        Q.pop();
    }
    Q.push(node);
    while(!Q.empty())
    {
        node=Q.front();
        Q.pop();
        for(int i=0;i<6;i++)
        {
            t=node;
            t.x+=dirx[i];
            t.y+=diry[i];
            t.z+=dirz[i];
            t.step++;
            if(t.x==xcu&&t.y==ycu&&t.z==zcu)
            {
                printf("Escaped in %d minute(s).\n",t.step);
                return;
            }
            if(t.x<0||t.x>=row||t.y<0||t.y>=col||t.z<0||t.z>=lev||map[t.x][t.y][t.z]=='#'||vis[t.x][t.y][t.z])//不符合要求的判断有三个方向上的边界,map为石头,已经访问的点
            {
                continue;
            }   
            else
            {
                vis[t.x][t.y][t.z]=1;//否则标记访问,压入队列中
                Q.push(t);
            }
        }
    }
    printf("Trapped!\n");
    return ;
}
int main()
{
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    while(scanf("%d%d%d",&lev,&row,&col)!=EOF)
    {
        memset(map,0,sizeof(map));
        memset(str,0,sizeof(str));
        memset(vis,0,sizeof(vis));
        if(lev==0&&row==0&&col==0)
            break;
        for(int i=0;i<lev;i++)//外层循环表示层数,对应三维数组的第三维
            for(int j=0;j<row;j++)//第二层循环表示行数,对应三维数组的第一维
            {
                scanf("%s",str);//按层输入
                for(int k=0;k<col;k++)//第三层循环表示列数,对应三维数组的第二维
                {
                    map[j][k][i]=str[k];
                }
            }
        for(int i=0;i<lev;i++)
            for(int j=0;j<row;j++)
                for(int k=0;k<col;k++)//找到入口和出口
                {
                    if(map[j][k][i]=='S')
                    {
                        xru=j;
                        yru=k;
                        zru=i;
                    }
                    if(map[j][k][i]=='E')
                    {
                        xcu=j;
                        ycu=k;
                        zcu=i;
                    }
                }
        BFS();  
    }
    return 0;
}

仅代表个人观点,欢迎交流探讨,勿喷!
POJ2251---Dungeon Master---BFS最短路之三维迷宫_第1张图片

PhotoBy:WLOP

http://weibo.com/wlop

你可能感兴趣的:(poj,bfs)