【POJ 2251】Dungeon Master(bfs)

本文详细解析了一道关于三维地图中寻找从起点S到终点E的最短路径问题,通过使用广度优先搜索(BFS)算法解决。代码实现包括地图读取、节点定义、状态检查及路径追踪等关键步骤。

BUPT2017 wintertraining(16) #5 B
POJ - 2251

题意

3维的地图,求从S到E的最短路径长度

题解

bfs

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define N 35
using namespace std;
struct node{
    int x,y,z,d;
}s,e;
int L,R,C;
int m[N][N][N],vis[N][N][N];
int ans;
int dx[7]={0,0,0,0,1,-1};
int dy[7]={0,0,1,-1,0,0};
int dz[7]={1,-1,0,0,0,0};
bool ck(int x,int u){
    return x>=0&&x<u;
}
void bfs(){
    ans=0;
    memset(vis,0,sizeof vis);
    queue<node>q;
    vis[s.x][s.y][s.z]=1;
    s.d=0;
    q.push(s);
    while(!q.empty()){
        node u=q.front();
        q.pop();
        if(u.x==e.x&&u.y==e.y&&u.z==e.z){
            ans=u.d;
            return;
        }
        for(int i=0;i<6;i++){
            int nx=u.x+dx[i],ny=u.y+dy[i],nz=u.z+dz[i];
            if(ck(nx,L)&&ck(ny,R)&&ck(nz,C)&&!vis[nx][ny][nz]&&m[nx][ny][nz]){
                q.push((node){nx,ny,nz,u.d+1});
                vis[nx][ny][nz]=1;
            }
        }
    }
}
int main() {
    while(scanf("%d%d%d",&L,&R,&C),L){
        memset(m,0,sizeof m);
        for(int i=0;i<L;i++){
            for(int j=0;j<R;j++)
                for(int k=0;k<C;k++){
                    char c;
                    scanf(" %c",&c);
                    if(c=='S')s=(node){i,j,k};
                    if(c=='E')e=(node){i,j,k};
                    if(c!='#')m[i][j][k]=1;
                }
        }
        bfs();
        if(ans)printf("Escaped in %d minute(s).\n",ans);
        else puts("Trapped!");
    }
    return 0;
}

转载于:https://www.cnblogs.com/flipped/p/6384806.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值