【POJ2251】Dungeon Master

本文介绍了一种使用广度优先搜索(BFS)解决三维迷宫问题的方法,并分享了一个有效的实现案例。通过将问题转化为三维数组的形式,利用BFS算法进行遍历,实现了从起点到终点的最短路径计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
这里写图片描述
这里写图片描述

用BFS简单些,无非就是吧二维数组变成三维数组,过程和其他求是否连通的题目大同小异。
坐标变化是6.
不过这题我写的时候直接在标记出压缩成一行判断,老是得不到正确结果,再看了大神的代码后,增加了check()这一判断函数,就奇迹般的ac了,所以以后对于复杂的判断最好写一个判断函数。
另外我发现大神代码的另一个优点,能减少输入后便利取S和E的循环次数,这种小的优化很重要,值得借鉴。(下方代码中“藏起来了”);
学习编程要虚心,谦逊,否则进步很慢,人家强我就跟人家学嘛,谁不是学过来的。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
const int N = 33;
char c[N][N][N];
bool vis[N][N][N];
int px[6]= {-1,1,0,0,0,0};
int py[6]= {0,0,-1,1,0,0};
int pz[6]= {0,0,0,0,-1,1};
int n,m,p;
int bx,by,bz,ex,ey,ez;
struct note {
    int x,y,z;
    int time;
} s;
int check(int x,int y,int z) {
    if(x<0 || y<0 || z<0 || x>=n || y>=m || z>=p)
        return 1;
    else if(c[x][y][z] == '#')
        return 1;
    else if(vis[x][y][z])
        return 1;
    return 0;
}
int bfs() {
    s.x=bx,s.y=by,s.z=bz,s.time=0;
    queue<note>Q;
    Q.push(s);
    vis[bx][by][bz]=true;
    while(!Q.empty()) {
        note now,end;
        printf("%d\n",Q.size());
        now=Q.front();
        Q.pop();
        if(now.x==ex&&now.y==ey&&now.z==ez)
            return now.time;
        for(int l=0; l<6; l++) {
            end=now;
            end.x=now.x+px[l];
            end.y=now.y+py[l];
            end.z=now.z+pz[l];
            if(check(end.x,end.y,end.z))//标记标记标记
                continue;
            end.time=end.time+1;
            vis[end.x][end.y][end.z]=true;
            Q.push(end);

        }
    }
    return -1;
}
int main() {
    while(scanf("%d%d%d",&n,&m,&p),n||m||p) {
        memset(vis,false,sizeof(vis));
        for(int i = 0; i<n; i++) {
            for(int j = 0; j<m; j++) {
                scanf("%s",c[i][j]);
                for(int r = 0; r<p; r++) {
                    if(c[i][j][r] == 'S') {
                        bx = i,by = j,bz = r;
                    } else if(c[i][j][r] == 'E') {
                        ex = i,ey = j,ez = r;
                    }
                }
            }
        }
        int ans=bfs();
        if(ans==-1)
            printf("Trapped!\n");
        else
            printf("Escaped in %d minute(s).\n",ans);
    }
    return 0;
}

http://poj.org/problem?id=2251

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值