ZOJ 1940 Dungeon Master【三维BFS】

<题目链接>

题目大意:

在一个立体迷宫中,问你从起点走到终点的最少步数。

解题分析:

与普通的BFS基本类似,只需要给数组多加一维,并且走的时候多加 上、下这两个方向就行。

 

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

int a,b,c;
char mpa[35][35][35];
int vis[35][35][35];
int dir[][3]={{1,0,0},{-1,0,0},{0,1,0},{0,0,1},{0,-1,0},{0,0,-1}};


struct node{
    int x,y,z;
    int step;
    node(int a=0,int b=0,int c=0,int d=0){
        x=a,y=b,z=c,step=d;
    }
}st,et;

void bfs(){
    memset(vis,0,sizeof(vis));
    queue<node>q;
    q.push(st);
    vis[st.x][st.y][st.z]=1;
    while(!q.empty()){
        node now=q.front();
        q.pop();
        if(now.x==et.x&&now.y==et.y&&now.z==et.z){
            printf("Escaped in %d minute(s).\n",now.step);
            return;
        }
        for(int i=0;i<6;i++){
            int xx=now.x+dir[i][0];
            int yy=now.y+dir[i][1];
            int zz=now.z+dir[i][2];
            if(xx<1||xx>a||yy<1||yy>b||zz<1||zz>c||vis[xx][yy][zz]||mpa[xx][yy][zz]=='#')continue;
            vis[xx][yy][zz]=1;
            q.push(node(xx,yy,zz,now.step+1));
        }
    }
    printf("Trapped!\n");
}

int main(){
    while(scanf("%d %d %d",&a,&b,&c)!=EOF,a||b||c){
        
        for(int i=1;i<=a;i++){
            getchar();
            for(int j=1;j<=b;j++){
                scanf("%s",mpa[i][j]+1);
                for(int k=1;k<=c;k++){
                    if(mpa[i][j][k]=='S')st=node(i,j,k,0);
                    if(mpa[i][j][k]=='E')et=node(i,j,k,0);
                }
            }
        }
        
        bfs();
        
    }
    return 0;
}

 

2018-08-30

posted @ 2018-08-30 22:34  悠悠呦~  阅读(207)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end