UVA 532 - Dungeon Master

来源:互联网 发布:域名快速备案多少钱 编辑:程序博客网 时间:2024/05/16 09:20

                       还是比着葫芦画瓢,按照UVA439的思路,只是把二维的数组改成三维的,因为对u的计算马虎了,、wa了6,7次,,55555555,太马虎了。

#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;int dist[35][35][35],vis[35][35][35],q[50003],m,r,c;int dx[]= {1,-1,0,0,0,0};int dy[]= {0,0,1,-1,0,0};int dz[]= {0,0,0,0,1,-1};int x1,y1,z1,x2,y2,z2;char maze[35][35][35];void bfs(int x,int y,int z){    int front=0,rear=0,d,u;    u=z*(r*c)+y*c+x;    vis[z][y][x]=1;    dist[z][y][x]=0;    q[rear++]=u;    while(front<rear)    {        u=q[front++];        z=u/(r*c);        y=(u-(r*c)*z)/c;        x=(u-(r*c)*z)%c;        for(d=0; d<6; d++)        {            int nx=x+dx[d],ny=y+dy[d],nz=z+dz[d];            if(nx>=0&&nx<c&&ny>=0&&ny<r&&nz>=0&&nz<m&&!vis[nz][ny][nx]&&maze[nz][ny][nx]!='#')            {                int v=nz*(r*c)+ny*c+nx;                q[rear++]=v;                vis[nz][ny][nx]=1;                dist[nz][ny][nx]=dist[z][y][x]+1;                if(nx==x2&&ny==y2&&nz==z2)                return ;            }        }    }}int main(){        while(scanf("%d%d%d",&m,&r,&c)&&(m||r||c))    {        memset(dist,0,sizeof(dist));        memset(vis,0,sizeof(vis));        getchar();        for(int i=0; i<m; i++)        {            for(int j=0; j<r; j++)            {                for(int k=0; k<c; k++)                {                    scanf("%c",&maze[i][j][k]);                    if(maze[i][j][k]=='S')                    {                        x1=k;                        y1=j;                        z1=i;                    }                    else if(maze[i][j][k]=='E')                    {                        x2=k;                        y2=j;                        z2=i;                    }                }                getchar();            }            getchar();        }        bfs(x1,y1,z1);        /* for(int i=0;i<m;i++)         {             for(int j=0;j<r;j++)             {                 for(int k=0;k<c;k++)                 printf("%d ",dist[i][j][k]);                 putchar('\n');             }         }*/        if(vis[z2][y2][x2]==1)            printf("Escaped in %d minute(s).\n",dist[z2][y2][x2]);        if(vis[z2][y2][x2]==0)            printf("Trapped!\n");    }    return 0;}