图论 --- 三维空间bfs

<传送门>

【题目大意】

给你一个三维的迷宫,让你计算从入口走到出口最少步数。

【题目分析】

其实和二维迷宫还是一样的,还是用队列来做,由于BFS算法一般是不需要回溯的,所以我们就用不着还用一个visit数组来记录是否访问过,直接将走过的结点置为不可走就可。

//Memory   Time
//  356K     32MS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
struct Node
{
    int x,y,z;
    int step;
};
queue<Node> que;
char Map[50][50][50];
int sx,sy,sz;
int ex,ey,ez;
int dir_x[]={-1,1,0,0,0,0};
int dir_y[]={0,0,-1,1,0,0};
int dir_z[]={0,0,0,0,1,-1};
void read(int n,int row,int col)
{
    int i,j,k;
    for(i=0;i<n;i++)
    {
        for(j=0;j<row;j++)
        {
            for(k=0;k<col;k++)
            {
                cin>>Map[i][j][k];
                if(Map[i][j][k]=='S')
                {
                    sx=i;
                    sy=j;
                    sz=k;
                }
                else if(Map[i][j][k]=='E')
                {
                    ex=i;
                    ey=j;
                    ez=k;
                }
            }
            getchar();
        }
        getchar();
    }
}

void BFS()
{
    Node q;
    q.x=sx;
    q.y=sy;
    q.z=sz;
    q.step=0;
    que.push(q);
    while(!que.empty())
    {
        Node tp=que.front();
        que.pop();
        int x=tp.x;
        int y=tp.y;
        int z=tp.z;
        int step=tp.step;
        for(int i=0;i<6;i++)
        {
            int tx=x+dir_x[i];
            int ty=y+dir_y[i];
            int tz=z+dir_z[i];
            if(Map[tx][ty][tz]=='.')
            {
                Node Q;
                Q.x=tx;
                Q.y=ty;
                Q.z=tz;
                Q.step=step+1;
                que.push(Q);
                Map[tx][ty][tz]='#';
            }
            else if(tx==ex&&ty==ey&&tz==ez)
            {
                cout<<"Escaped in "<<step+1<<" minute(s)."<<endl;
                return;
            }
        }
    }
    cout<<"Trapped!"<<endl;
}

int main()
{
//    freopen("cin.txt", "r", stdin);
    int i, j, k;
    int n,row,col;
    while(cin>>n>>row>>col&&(n+row+col))
    {
        while(!que.empty()) que.pop();
        getchar();
        read(n,row,col);
        BFS();
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/crazyacking/p/3762946.html