1. 程式人生 > >POJ-2251 Dungeon Master(簡單的三維bfs)

POJ-2251 Dungeon Master(簡單的三維bfs)

#include <iostream>
#include<stdio.h>
#include<queue>
#include<string.h>

using namespace std;

const int SIZE=35;
int l,r,c;

char mp[SIZE][SIZE][SIZE];
int step[SIZE][SIZE][SIZE];
int check[SIZE][SIZE][SIZE];

int to[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node
{
    int i,j,k;
    node(int a,int b,int c)
    {
        i=a;j=b;k=c;
    }
};

void bfs(int r1,int r2,int r3,int e1,int e2,int e3)
{
    queue<node> q;
    while(!q.empty())
    {
        q.pop();
    }
    q.push(node(r1,r2,r3));
    check[r1][r2][r3]=1;
    step[r1][r2][r3]=0;

    while(!q.empty())
    {
        int n1=q.front().i;
        int n2=q.front().j;
        int n3=q.front().k;
        q.pop();


        if(n1==e1 && n2==e2 &&n3==e3) break;

        for(int i=0;i<6;i++)
        {
            int new1=n1+to[i][0];
            int new2=n2+to[i][1];
            int new3=n3+to[i][2];


            if(new1>=0 && new1<l &&new2>=0 && new2<r &&new3>=0 && new3<c &&mp[new1][new2][new3]=='.'&&(!check[new1][new2][new3]))
            {

                check[new1][new2][new3]=1;
                step[new1][new2][new3]=step[n1][n2][n3]+1;
                q.push(node(new1,new2,new3));
            }
        }
    }
}

int main()
{

    int r1,r2,r3;
    int e1,e2,e3;

    while(cin>>l>>r>>c &&(l||r||c))
    {
        memset(mp,0,sizeof(mp));
         memset(step,0,sizeof(step));
          memset(check,0,sizeof(check));
        for(int i=0;i<l;i++,getchar())
        {
            for(int j=0;j<r;j++,getchar())
            {
                for(int k=0;k<c;k++)
                {
                    cin>>mp[i][j][k];
                    if(mp[i][j][k]=='S')
                    {
                        r1=i;r2=j;r3=k;
                    }
                    if(mp[i][j][k]=='E')
                    {
                        e1=i;e2=j;e3=k;mp[i][j][k]='.';//這個地方把最後的E改成.不然最後一步搜不到。
                    }
                }
            }


        }
        bfs(r1,r2,r3,e1,e2,e3);
        if(step[e1][e2][e3])
        {
            printf("Escaped in %d minute(s).\n",step[e1][e2][e3]);
        }
        else
        {
            puts("Trapped!");
        }
    }
    return 0;
}