图论 --- 三维空间bfs

<传送门>

 

【题目大意】

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

 

【题目分析】

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

 

图论 --- 三维空间bfs
//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

 

 

 

你可能感兴趣的:(bfs)