poj 2251 Dungeon Master(广搜)

题意:三维空间,可以走上下左右前后六个方向,求最短路径,BFS

  

#include<stdio.h>

#include<queue>

#include<string.h>

using namespace std;

const int MAXN=50;



char str[MAXN][MAXN][MAXN];

int step[MAXN][MAXN][MAXN];

int vis[MAXN][MAXN][MAXN];

int l,r,c;

struct Node

{

    int x,y,z;

}s,e;



int BFS()

{

    int i,j;

    Node head,next;

    queue<Node>Q;

    Q.push(s);

    step[s.x][s.y][s.z]=0;

    while(!Q.empty())

    {

        head=Q.front();

        Q.pop();

        for(i=0;i<6;i++)

        {

            next=head;

            if(i==0) next.x-=1;

            if(i==1) next.x+=1;

            if(i==2) next.y-=1;

            if(i==3) next.y+=1;

            if(i==4) next.z-=1;

            if(i==5) next.z+=1;

            if(!vis[next.x][next.y][next.z] && str[next.x][next.y][next.z]==1)

            {

                vis[next.x][next.y][next.z]=1;

                Q.push(next);

                step[next.x][next.y][next.z]=step[head.x][head.y][head.z]+1;

                if(next.x==e.x && next.y==e.y && next.z==e.z) return  step[head.x][head.y][head.z]+1;

            }

        }

    }

    return  0;

}

int main()

{

    int i,j,k;

    while(scanf("%d%d%d",&l,&r,&c)!=EOF)

    {

        if(l==0 && r==0 && c==0) break;

        memset(vis,0,sizeof(vis));

        memset(str,0,sizeof(str));

        for(i=1; i<=l; i++)

        {

            for(j=1; j<=r; j++)

            {

                scanf("%s",str[i][j]+1);

                for(k=1; str[i][j][k]; k++)

                {

                    if(str[i][j][k]=='#') str[i][j][k]=0;

                    if(str[i][j][k]=='.') str[i][j][k]=1;

                    if(str[i][j][k]=='S')

                    {

                        str[i][j][k]=1;

                        s.x=i;

                        s.y=j;

                        s.z=k;

                    }

                    if(str[i][j][k]=='E')

                    {

                        str[i][j][k]=1;

                        e.x=i;

                        e.y=j;

                        e.z=k;

                    }

                }

            }

        }

        int ans=BFS();

        if(ans) printf("Escaped in %d minute(s).\n",ans);

        else printf("Trapped!\n");



    }

    return 0;

}

 

你可能感兴趣的:(master)