天天看点

kuangbin 简单搜索 - POJ - 2251 Dungeon Master (三维迷宫问题 bfs)

POJ - 2251 Dungeon Master (三维迷宫问题 bfs)

看到三维bfs,当然少不了二维的bfs,先来看看二维bfs的迷宫问题怎么解决,就是多了一个维度其他没有啥的

kuangbin 简单搜索 - 迷宫问题 POJ - 3984 (二维迷宫问题 bfs)

kuangbin 简单搜索 - POJ - 2251 Dungeon Master (三维迷宫问题 bfs)
kuangbin 简单搜索 - POJ - 2251 Dungeon Master (三维迷宫问题 bfs)

详情看代码!!!逻辑有点绕,实际上跟二维是差不多的,如果不理解的话可以看看二维的。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>

#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define ll long long
//#define int ll
#define INF 0x3f3f3f3f
using namespace std;
int read()
{
	int w = 1, s = 0;
	char ch = getchar();
	while (ch < '0' || ch>'9') { if (ch == '-') w = -1; ch = getchar(); }
	while (ch >= '0' && ch <= '9') { s = s * 10 + ch - '0';    ch = getchar(); }
	return s * w;
//最大公约数
}int gcd(int x,int y) {
    if(x<y) swap(x,y);//很多人会遗忘,大数在前小数在后
    //递归终止条件千万不要漏了,辗转相除法
    return x % y ? gcd(y, x % y) : y;
}
int lcm(int x,int y)//计算x和y的最小公倍数
{
    return x * y / gcd(x, y);//使用公式
}
//------------------------ 以上是我常用模板与刷题几乎无关 ------------------------//
const int maxn = 33;
char Map[maxn][maxn][maxn];//迷宫地图
bool vis[maxn][maxn][maxn];
int n,m,h;
//按照坐标遍历6个方向查看可行路线。
int Next[6][3]={{0,0,1},{0,1,0},{1,0,0},{0,0,-1},{0,-1,0},{-1,0,0}};

struct Node {
    int x, y, z;
    int steps;
};
struct Node Start, End;
int l, r, c;
 //三维bfs
int bfs() {
    int next[6][3] = { { -1,0,0 },{ 0,-1,0 },{ 0,0,-1 },{ 1,0,0 },{ 0,1,0 },{ 0,0,1 } };
    queue<Node> q;
    q.push(Start);
    vis[Start.x][Start.y][Start.z] = true;
    //如果队列不空入队
    while (!q.empty()) {
        struct Node temp = q.front();
        q.pop();
        if (Map[temp.x][temp.y][temp.z] == 'E')
            return temp.steps;
        //枚举6个方向
        for (int i = 0; i < 6; i++) {
            struct Node add;
            //以这个方向行走后所得到的新的坐标 
            add.x = temp.x + next[i][0];
            add.y = temp.y + next[i][1];
            add.z = temp.z + next[i][2];
            add.steps = temp.steps + 1;
            //判断该坐标是否合法
            //将这个位置标记为无法行走(即岩石)
            if (add.x >= 0 && add.y >= 0 && add.z >= 0 && add.x < r && add.y < c && add.z < l && Map[add.x][add.y][add.z] != '#' && !vis[add.x][add.y][add.z])
            {
                vis[add.x][add.y][add.z] = true;
                q.push(add);
            }
        }
    }
    return -1;
}
int main() {
    while (scanf("%d %d %d", &l, &r, &c) != EOF)
    {
        memset(vis, false, sizeof(vis));//初始化vis
        if (l == 0 && r == 0 && c == 0)
            break;
        for (int i = 0; i<l; i++) {
            for (int j = 0; j<r; j++) {
                for (int k = 0; k<c; k++) {
                    cin >> Map[j][k][i];
                    if (Map[j][k][i] == 'S') {
                        Start.x = j; Start.y = k; Start.z = i;
                    }
                }
            }
        }
        int res = bfs();//进行三维BFS 
        if (res != -1)//否则按照题目中给出的格式输出res
            printf("Escaped in %d minute(s).\n", res);
        else
            printf("Trapped!\n");//如果无法到达输出"Trapped!"
    }
    return 0;
}
           

继续阅读