poj 2251 Dungeon Master

迷宫问题求最短路,只是本题为一个3D的迷宫,同样用bfs求解,在二维基础上加一维,其他的相同。

#include "iostream"
#include "queue"
#include "cstring"

using namespace std;

char maze[35][35][35];
int visit[35][35][35];
int stepArr[6][3] = {{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};  //有上、下、左、右、前、后六个方向

struct Node{
    int x;
    int y;
    int z;
    int step;
    Node(int a,int b,int c,int d):x(a),y(b),z(c),step(d){};
};

int sx,sy,sz; //开始的位置
int L,R,C;

int bfs() {
    Node node(sx,sy,sz,0);
    queue<Node>q;

    while(!q.empty()) q.pop(); //清空队列

    q.push(node);

    while(!q.empty()) {
        node = q.front();
        q.pop();
//z表示高对应L,x,y对应二维中的R,C
        if(maze[node.z][node.x][node.y] == 'E') return node.step;

        visit[node.z][node.x][node.y] = 1;

        for(int i = 0; i < 6; i++) {
            int x = node.x + stepArr[i][0];
            int y = node.y + stepArr[i][1];
            int z = node.z + stepArr[i][2];

            if(x >= 0 && x < R && y >= 0 && y < C && z >= 0 && z < L && visit[z][x][y] == 0 && maze[z][x][y] != '#'){
                visit[z][x][y] = 1;
                Node next(x,y,z,node.step+1);
                q.push(next);
            }
        }

    }

    return -1;
}

int main() {

    while(cin >> L >> R >> C) {
            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 >> maze[i][j][k];
                if(maze[i][j][k] == 'S') {
                    sz = i;
                    sx = j;
                    sy = k;
                }
            }
        memset(visit,0,sizeof(visit)); //当初自己做的时候忘了这一步,导致WA
        int t = bfs();

        if(t == -1) cout << "Trapped!" << endl;
        else cout << "Escaped in " << t << " minute(s)." << endl;


    }

return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值