poj 2251 Dungeon Master

1. 题意:有一个3维地牢,目前所处位置是‘S’,要想逃生,可以往东西南北上下六个方向走,‘#’代表不能通过,‘。’代表可以通过,求逃离到出口‘E’最短时间,走一步一分钟。

2. 思路:bfs简单搜素,注意三维空间处理,方向可处理为:int dir[6][3]= {{0,0,1},{0,-1,0},{1,0,0},{0,0,-1},{0,1,0},{-1,0,0}};

3. 注意:1.加入点时,要加入出口‘E’;

            2.注意数组大小

4.代码:

#include<stdio.h>
#include<string.h>
char map[35][35][35];
int sx,sy,sz,ex,ey,ez;
int dir[6][3]= {{0,0,1},{0,-1,0},{1,0,0},{0,0,-1},{0,1,0},{-1,0,0}};
int visit[100][100][100];
struct node
{
    int x;
    int y;
    int z;
    int step;
} a[30000];//数组大小,最大点的个数
int bfs(int l,int r,int c)
{
    int front=0;
    int rear=1;
    a[0].x=sx;
    a[0].y=sy;
    a[0].z=sz;
    a[0].step=0;
    node cur,change;
    while(front<rear)
    {
        cur=a[front++];
        //printf("%d%d%d\n",cur.x,cur.y,cur.z);
        if(cur.x==ex&&cur.y==ey&&cur.z==ez)
            return cur.step;
        for(int i=0; i<6; i++)
        {
            int tx=cur.x+dir[i][0];
            int ty=cur.y+dir[i][1];
            int tz=cur.z+dir[i][2];
            if(tx>=0&&tx<l&&ty>=0&&ty<r&&tz>=0&&tz<c&&visit[tx][ty][tz]==0&&(map[tx][ty][tz]=='.'||map[tx][ty][tz]=='E'))//注:加入E点
            {
                visit[tx][ty][tz]=1;
                change.x=tx;
                change.y=ty;
                change.z=tz;
                change.step=cur.step+1;
                a[rear++]=change;
            }
        }
    }
    return -1;
}
int main()
{
    int l,r,c;
    while(scanf("%d%d%d",&l,&r,&c)!=EOF)
    {
        memset(visit,0,sizeof(visit));
        if(l==0&&r==0&&c==0)
            break;
        for(int i=0; i<l; i++)
        {
            for(int j=0; j<r; j++)
            {
                scanf("%s",map[i][j]);
                //printf("%s\n",map[i][j]);
                for(int k=0; k<c; k++)
                {
                    if(map[i][j][k]=='S')
                    {
                        sx=i;
                        sy=j;
                        sz=k;
                    }
                    if(map[i][j][k]=='E')
                    {
                        ex=i;
                        ey=j;
                        ez=k;
                    }
                }
            }

        }
        int ans=bfs(l,r,c);
        if(ans==-1)
            printf("Trapped!\n");
        else printf("Escaped in %d minute(s).\n",ans);

    }
    return 0;
}


 

 

你可能感兴趣的:(poj 2251 Dungeon Master)