2. 地牢大师

原题:棋盘问题

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;

const int N=110;
char g[N][N][N];
int dist[N][N][N];
int n,m,d;
struct Node{
    int x,y,z;
};
Node start,ends1;
int dx[6]={0,0,1,-1,0,0},dy[6]={1,-1,0,0,0,0},dz[6]={0,0,0,0,1,-1};


void bfs()
{
    queue<Node> q;
    q.push(start);
    memset(dist,0x3f,sizeof dist);
    dist[start.x][start.y][start.z]=0;
    while(q.size())
    {
        Node t=q.front();
        q.pop();
        if(t.x==ends1.x&&t.y==ends1.y&&t.z==ends1.z) return;
        for(int u=0;u<6;u++)
        {
            int x=t.x+dx[u],y=t.y+dy[u],z=t.z+dz[u];
            if(x>=0&&x<n&&y>=0&&y<m&&z>=0&&z<d&&g[x][y][z]!='#')
            {
                if(dist[x][y][z]>dist[t.x][t.y][t.z]+1)
                {
                    dist[x][y][z]=dist[t.x][t.y][t.z]+1;
                    q.push( {x,y,z} );
                }
            }
        }
       
    }
}

int main()
{
    while(cin>>n>>m>>d,n||m||d)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cin>>g[i][j];
                for(int k=0;k<d;k++)
                {
                    if(g[i][j][k]=='S') start={i,j,k};
                    else if(g[i][j][k]=='E') ends1={i,j,k};
                }
            }
        }
        bfs();
        int ans=dist[ends1.x][ends1.y][ends1.z];
        if(ans==0x3f3f3f3f) puts("Trapped!");
        else printf("Escaped in %d minute(s).\n",ans);
    }
    return 0;
}

posted on 2023-03-14 21:59  skaman  阅读(23)  评论(0)    收藏  举报