POJ 2251 Dungeon Master (BFS)

Description

You are trapped in a 3D 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 takes one minute to move one unit north, south, east, west, up or down. You cannot move diagonally and the maze is surrounded by solid rock on all sides.

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 rows and columns making up the plan of each level.
Then there will follow L blocks of R lines each containing C characters. Each character describes one cell of the dungeon. A cell full of rock is indicated by a '#' and empty cells are represented by a '.'. Your starting position is indicated by 'S' and the exit by the letter 'E'. There's a single blank line after each level. Input is terminated by three zeroes for L, R and C.

Output

Each maze generates one line of output. If it is possible to reach the exit, print a line of the form

Escaped in x minute(s).

where x is replaced by the shortest time it takes to escape.
If it is not possible to escape, print the line

Trapped!

Sample Input

3 4 5
S....
.###.
.##..
###.#

#####
#####
##.##
##...

#####
#####
#.###
####E

1 3 3
S##
#E#
###

0 0 0

Sample Output

Escaped in 11 minute(s).
Trapped!

Source

Ulm Local 1997

还是vis判断好用!

完整代码:

/*0ms,684KB*/

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int dx[6] = {1, -1, 0, 0, 0, 0};
const int dy[6] = {0, 0, 1, -1, 0, 0};
const int dz[6] = {0, 0, 0, 0, 1, -1};
const int maxn = 35;  

struct node
{
    int x, y, z, step;
    node() {}
    node(int a, int b, int c, int d)
    {
        x = a, y = b, z = c, step = d;
    }
} tmp;
queue<node> q;
// http://www.bianceng.cn/Programming/sjjg/201410/45437.htm
int n, m, t, x, y, z, i, j, k;
bool vis[maxn][maxn][maxn];
char mp[maxn][maxn][maxn];  

bool bfs()
{
    while (!q.empty())
    {
        tmp = q.front();
        q.pop();
        if (mp[tmp.z][tmp.y][tmp.x] == 'E')
        {
            printf("Escaped in %d minute(s).\n", tmp.step);
            return true;
        }
        for (i = 0; i < 6; ++i)
        {
            x = tmp.x + dx[i], y = tmp.y + dy[i], z = tmp.z + dz[i];
            if (mp[z][y][x] != '#' && !vis[z][y][x])
            {
                vis[z][y][x] = true;
                q.push(node(x, y, z, tmp.step + 1));
            }
        }
    }
    return false;
}  

int main()
{
    while (~scanf("%d%d%d\n", &t, &n, &m), t)
    {
        memset(vis, 0, sizeof(vis));
        memset(mp, '#', sizeof(mp));
        while (!q.empty()) q.pop();
        for (i = 1; i <= t; ++i)
        {
            for (j = 1; j <= n; ++j)
            {
                for (k = 1; k <= m; ++k)
                {
                    mp[i][j][k] = getchar();
                    if (mp[i][j][k] == 'S')
                    {
                        vis[i][j][k] = true;
                        q.push(node(k, j, i, 0));
                    }
                }
                getchar();
            }
            getchar();
        }
        if (!bfs()) puts("Trapped!");
    }
    return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, line
, and
, tmp
, a z i
, of
The
poj bfs、poj2251、poj2251测试数据、dungeon master、dungeonmaster.w3m,以便于您获取更多的相关知识。

时间: 2024-09-17 04:28:31

POJ 2251 Dungeon Master (BFS)的相关文章

POJ 3206 Borg Maze:BFS+Prim

Borg Maze:http://poj.org/problem?id=3026 大意:给你一个m*n的迷宫,可以上下左右的走,只能走空格或字母,求出将所有字母连通起来的最小耗费. 思路:先用BFS求出S到所有A的距离,再用Prim求最小生成树,求出最小耗费.这个题坑的不在题,是数据太坑了,在空格处理上没弄好,贡献了好几个WA和CE,看Discuss才知道很坑,最后用G++过了的代码,C++还RE,实在不知道说什么好了  =.= 更多精彩内容:http://www.bianceng.cnhttp

poj 3984 bfs

http://poj.org/problem?id=3984 #include<iostream> #include<stdio.h> #include<cstring> #define Max 0x7f7f7f7f using namespace std; int map[6][6]; int visited[6][6]; int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; int ans[6][6]; int pre[30]; st

POJ 1915 Knight Moves 双向BFS 入门

 Description Background Mr Somurolov, fabulous chess-gamer indeed, asserts that no one else but him can move knights from one position to another so fast. Can you beat him? The Problem Your task is to write a program to calculate the minimum number o

poj 3414 Pots bfs+模拟

#include<iostream> #include<cstring> #define fillA 1 #define pourAB 2 #define dropA 3 #define fillB 4 #define pourBA 5 #define dropB 6 #define N 10000 using namespace std; int vis[105][105]; class node { public: int A, B; int dir; node() { A=0

poj 2935 Basic Wall Maze bfs

很简单的bfs,各点都从0开始保存,可以用%和/确定x,y省空间   /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <cstdio> #include <cstring> #include <queue> #define place(x,y) x+y*6 using

poj 3414 (POTS) (BFS)

Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12295   Accepted: 5190   Special Judge Description You are given two pots, having the volume of A and B liters respectively. The following operations can be performed: FILL(i)        f

poj 1724ROADS(bfs和dfs做法)

/* dfs比较好想,就是测试数据的问题,导致在遍历边的时候要倒着遍历才过! */ #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #define Max 0x3f3f3f3f using namespace std; struct node{ int D; int L, T; node(int D, int L,

【POJ 3669 Meteor Shower】简单BFS

流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封锁).安全地带为永远不会被封锁的点. 简单bfs,开始WA在把平面空间上限当成300*300,但根据题目,这只是有流星雨撞击的范围.实际可走的空间理论上没上限,但分析可得,离原点最近的安全地带一定在(302,302)范围内,所以应可把数组至少开为303*303. 后来WA在把G[0][0]==1的情

POJ 3278(bfs)

Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31637   Accepted: 9740 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000