POJ 2251 Dungeon Master(ダンジョンマスター)三次元広捜

8717 ワード

テーマリンク:[POJ 2251](http://poj.org/problem?id=2251)タイトル記述:Dungeon Master Time Limit:1000 MS Memory Limit:65536 K Total Submissions:21644 Acctepted:8419 Description
You are troped in a 3 D dungeon and need to find the quickest way out!The dungeon is composed of unit cubes which may or may not be filled with rock.It tars one minute to move one unit north,south,eat,west,up or down.You cannot move diagonally and the maze surround.sold.sold。
Is an escape possible?If yes、how long will it take?Input
The input consists of a number of dungeons.Each dungeon description starts with a line containing three integers L,R and C(all limited to 30 in size)L is the number of levels making up the dungeon.R and C are the number of rowws and columns Making uuuthe pln of each level.The n there will followL blocks of R lines each conconcontititititiinininininininininininininininininininininininincccccccccccccccccharacters.Eacdedededededededededededededededededededededededededededededererererererererererererererel.Eacacaaaaaaaarepresented by a'.Your starting position is indicated by‘S’and the exit by the letter‘E’.The’s a single blank line after each level.Input is terminated by three zroes for L,R and C.Output
Each maze generators one line of output.If it is possible to reach the exit,print a line of the form Escated in x minute(s)
where x is replaced by the shotest time it Taes to escape.If it is not possible to escape,print the line Traped!Sample Input
3 4.5 S.....⑵33751;.
..。
同前
同前
..。

同前
同前
..。
E
1 3 S〓〓〓〓〓〓〓〓〓〓
E
同前
0 0 Sample Output
Escated in 11 minute(s).Trapped!ソurce
Ulm Local 1997は簡単に要約しています。この問題は三次元広捜の問題で、前後左右と上下六方向に分けられています。だから、6*3の配列で方向を保存して、行列の先進的な特徴を利用して広く検索することができません。コードの実装:
#include 
#include 
#include 
#include 
#include 

using namespace std;

int L,R,C;
char map[35][35][35];//            
int vis[35][35][35];//           
int sx,sy,sz,ex,ey,ez;//            ,      
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 x,y,z,step;
};
int check(int x,int y,int z)//         ,“1”      ,“0”      
{
    if(x<0||y<0||z<0||x>=L||y>=R||z>=C)//        
        return 1;
    else if(map[x][y][z]=='#')//        ~
        return 1;
    else if(vis[x][y][z])//          ~
        return 1;
    return 0;
}
int bfs()
{
    int i;
    node a,next;
    queue Q;
    a.x=sx;
    a.y=sy;
    a.z=sz;
    a.step=0;
    vis[sx][sy][sz]=1;
    Q.push(a);//  
    while(!Q.empty())
    {
        a=Q.front();// a          
        Q.pop();//    
        if(a.x==ex&&a.y==ey&&a.z==ez)
        {
            return a.step;
        }
        for(i=0; i<=6; i++)
        {
            next=a;
            next.x=a.x+to[i][0];
            next.y=a.y+to[i][1];
            next.z=a.z+to[i][2];
            if(check(next.x,next.y,next.z))
                continue;
            vis[next.x][next.y][next.z]=1;
            next.step=a.step+1;
            Q.push(next);//  
        }
    }
    return 0;
}

int main()
{
    while(scanf("%d%d%d",&L,&R,&C)!=EOF)
    {
        if(L==0&&R==0&&C==0)
            break;
        for(int i=0; ifor(int j=0; jscanf("%s",map[i][j]);
                for(int r=0; rif(map[i][j][r]=='S')
                    {
                        sx=i;
                        sy=j;
                        sz=r;
                    }
                    else if(map[i][j][r]=='E')
                    {
                        ex=i;
                        ey=j;
                        ez=r;
                    }
                }
            }
        }
        memset(vis,0,sizeof(vis));
        int ans;
        ans=bfs();
        if(ans)
            printf("Escaped in %d minute(s).
"
,ans); else printf("Trapped!
"
); } return 0; }