首页 > 代码库 > poj 2251 Dungeon Master(bfs)

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!\n");        }        else {            printf("Escaped in %d minute(s).\n" , ans);        }    }    return 0;}

poj 2251 Dungeon Master(bfs)