poj 2251 Dungeon Master(bfs)

题目链接  http://poj.org/problem?id=2251

题意:一个立体空间, 输入三个数,L,R,C,代表有L个平面,R行,C列,.代表可以走,#代表不能走,S代表开始点,E代表结束点,问从S开始走,对每个位置,有六个走法,即空间的六个方向的走法(上下东南西北),一分钟可以走一个点,问从S走到E点,最少可以经过多少分钟,若不能到达,则输出Trapped!

简单的三维bfs随便做一下就可以了。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
using namespace std;
char map[40][40][40];
int dr[4][2] = {1 , 0 , 0 , 1 , -1 , 0 , 0 , -1} , vis[40][40][40] , ans , l , r , c;
struct TnT {
    int h , x , y , step;
};
int bfs(int h , int x , int y , int step) {
    memset(vis , 0 , sizeof(vis));
    queue<TnT>q;
    TnT p , gg , gl;
    p.h = h , p.x = x , p.y = y , p.step = step;
    vis[p.h][p.x][p.y] = 1;
    q.push(p);
    while(!q.empty()) {
        gg = q.front();
        if(map[gg.h][gg.x][gg.y] == 'E') {
            return gg.step;
        }
        for(int j = 0 ; j < 3 ; j++) {
            if(j == 0) {
                for(int i = 0 ; i < 4 ; i++) {
                    gl = gg;
                    gl.x += dr[i][0];
                    gl.y += dr[i][1];
                    if(gl.x >= 0 && gl.x < r && gl.y >= 0 && gl.y < c && map[gl.h][gl.x][gl.y] != '#' && !vis[gl.h][gl.x][gl.y]) {
                        gl.step++;
                        vis[gl.h][gl.x][gl.y] = 1;
                        q.push(gl);
                    }
                }
            }
            if(j == 1) {
                if(gg.h > 0 && map[gg.h - 1][gg.x][gg.y] != '#' && !vis[gg.h - 1][gg.x][gg.y]) {
                    gl = gg;
                    gl.step++;
                    gl.h--;
                    vis[gl.h][gl.x][gl.y] = 1;
                    q.push(gl);
                }
            }
            if(j == 2) {
                if(gg.h < l - 1 && map[gg.h + 1][gg.x][gg.y] != '#' && !vis[gg.h + 1][gg.x][gg.y]) {
                    gl = gg;
                    gl.step++;
                    gl.h++;
                    vis[gl.h][gl.x][gl.y] = 1;
                    q.push(gl);
                }
            }
        }
        q.pop();
    }
    return -1;
}
int main()
{
    while(scanf("%d%d%d" , &l , &r , &c)) {
        if(l == 0 || r == 0 || c == 0)
            break;
        int star = 0 , end = 0;
        for(int i = 0 ; i < l ; i++) {
            for(int j = 0 ; j < r ; j++) {
                scanf("%s" , map[i][j]);
                for(int k = 0 ; k < c ; k++) {
                    if(map[i][j][k] == 'S') {
                        star = i;
                    }
                    if(map[i][j][k] == 'E') {
                        end = i;
                    }
                }
            }
        }
        ans = 0;
        for(int i = 0 ; i < r ; i++) {
            for(int j = 0 ; j < c ; j++) {
                if(map[star][i][j] == 'S') {
                    ans = bfs(star , i , j , 0);
                }
            }
        }
        if(ans == -1) {
            printf("Trapped!
");
        }
        else {
            printf("Escaped in %d minute(s).
" , ans);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6081869.html