Dungeon Master【三维BFS】

    xiaoxiao2021-04-13  50

    Dungeon Master 你被困在一个3D地牢中且继续寻找最短路径逃生!地牢由立方体单位构成,立方体中不定会充满岩石。向上下前后左右移动一个单位需要一分钟。你不能对角线移动并且迷宫四周坚石环绕。

      是否存在逃出生天的可能性?如果存在,则需要多少时间? Input - 输入   输入第一行是一个数表示地牢的数量。   每个地牢的描述的第一行为L,R和C(皆不超过30)。   L表示地牢的层数。   R和C分别表示每层地牢的行与列的大小。

      随后L层地牢,每层R行,每行C个字符。   每个字符表示地牢的一个单元。’#’表示岩石单元,’.’表示空白单元。你的起始位置在’S’,出口为’E’。   每层地牢后都有一个空行。L,R和C均为0时输入结束。 Output - 输出   每个迷宫对应一行输出。   如果可以逃生,则输出如下 Escaped in x minute(s).   x为最短脱离时间。

      如果无法逃生,则输出如下 Trapped! Sample Input - 输入样例 3 4 5 S…. .###. .##..

    .

    #

    #

    .

    #

    #

    .

    E

    1 3 3 S##

    E

    #

    0 0 0 Sample Output - 输出样例 Escaped in 11 minute(s). Trapped!

    模版题 代码

    #include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; #define LL long long #define M 50 int to[][3]={0,-1,0,0,1,0,0,0,1,0,0,-1,-1,0,0,1,0,0}; struct dot { int v,x,y,step; }; int mp[M][M][M]; void bfs(dot st,dot ed) { int i,j; queue<dot>Q; int flag=0; dot now,next; st.step=0; mp[st.v][st.x][st.y]=0; Q.push(st); while(!Q.empty()) { now=Q.front();Q.pop(); if(now.v==ed.v&&now.x==ed.x&&now.y==ed.y) { flag=1; break; } for(i=0;i<6;i++) { next.x=now.x+to[i][1]; next.v=now.v+to[i][0]; next.y=now.y+to[i][2]; if(mp[next.v][next.x][next.y]==1) // 这里可以省事,整个地图都用 1 表示可走,0 表示 不可走,不用VIS 标记数组 { next.step=now.step+1; mp[next.v][next.x][next.y]=0; Q.push(next); } } } if(flag) printf("Escaped in %d minute(s).\n",now.step); else printf("Trapped!\n"); } int main() { int v,n,m; dot st,ed; while(~scanf("%d%d%d",&v,&n,&m)&&(v||n||m)) { memset(mp,0,sizeof(mp)); int i,j,k; for(i=1;i<=v;i++) { for(j=1;j<=n;j++) { getchar(); for(k=1;k<=m;k++) { char c; scanf("%c",&c); if(c=='S') { st.x=j; st.v=i; st.y=k; mp[i][j][k]=1; } else if(c=='E') { ed.x=j; ed.v=i; ed.y=k; mp[i][j][k]=1; } else if(c=='.') mp[i][j][k]=1; } } getchar(); } bfs(st,ed); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-669529.html

    最新回复(0)