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

4 篇文章 0 订阅

题目链接: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;
}

仅代表个人观点,欢迎交流探讨,勿喷!
这里写图片描述

PhotoBy:WLOP

http://weibo.com/wlop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值