• 【POJ2251】Dungeon Master


    本题传送门

    本题知识点:宽度优先搜索

    题意简单。在一个L层高的楼里,去走迷宫,就是问从S走到E的最短路径。每走一格每上或者下一层都算1步。

    一开始以为这个“立体迷宫”有点吓到我(题做得太少了),后来发觉,只是一个三维数组以及多了两个操作方向(原地向上或者原地向下),除此之外就是简单的bfs模板题了。

    数据很小。

    // POJ 2251
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    
    // R == H, C == W
    int L, R, C;
    char maze[35][35][35];
    int len[35][35][35];
    bool stay[35][35][35];
    int bl, br, bc, el, er, ec;
    int rl[] = { 0, 0, 0, 0, 1, -1 };
    int rc[] = { 1, -1, 0, 0, 0, 0 };
    int rr[] = { 0, 0, 1, -1, 0, 0 };
    
    struct node{
        int l, r, c;
    };
    queue<node> que;
    
    void build(){
        for(int i = 0; i < L; i++){
                for(int j = 0; j < R; j++){
                    scanf("%s", maze[i][j]);
                    // 找起始点
                    for(int k = 0; k < C; k++){
                        if(maze[i][j][k] == 'S'){
                            bl = i; br = j; bc = k;
                        }
                        if(maze[i][j][k] == 'E'){
                            el = i; er = j; ec = k;
                        }
                    }
                }
            }
        // 注意队列一定要清空!
        while(!que.empty()) que.pop();
    }
    
    void show(){
        cout << "len
    ";
        for(int i = 0; i < L; i++){
            for(int j = 0; j < R; j++){
                for(int k = 0; k < C; k++){
                    printf("%d ", len[i][j][k]);
                } cout << endl;
            } cout << endl;
        } cout << endl;
    }
    
    void bfs(){
        node a;
        a.l = bl; a.r = br; a.c = bc;
        len[bl][br][bc] = 0;
        stay[bl][br][bc] = true;
        que.push(a);
    
    
        while(!que.empty()){
            node now = que.front(), next; que.pop();
    
            if(now.l == el && now.r == er && now.c == ec){
                break;
            }
    
            // 这里比较写的有点花
            for(int i = 0; i < 6; i++){
                next.l = now.l + rl[i]; next.r = now.r + rr[i]; next.c = now.c + rc[i];
                if(0 <= next.l && next.l < L && 0 <= next.r && next.r < R && 0 <= next.c && next.c < C
                   && maze[next.l][next.r][next.c] != '#' && !stay[next.l][next.r][next.c]){
                        stay[next.l][next.r][next.c] = true;
                        len[next.l][next.r][next.c] = len[now.l][now.r][now.c] + 1;
                        que.push(next);
                   }
            }
        }
    }
    
    int main()
    {
        while(scanf("%d %d %d", &L, &R, &C) && L + R + C != 0){
            memset(stay, false, sizeof(stay));
            memset(len, -1, sizeof(len));
            build();
    
            // bfs
            bfs();
    
    //        show();
            if(len[el][er][ec] != -1)
                printf("Escaped in %d minute(s).
    ", len[el][er][ec]);
            else printf("Trapped!
    ");
        }
        return 0;
    }
    
    //3 3 3
    //S.#
    //###
    //###
    //
    //#.#
    //###
    //###
    //
    //#E#
    //###
    //###
    
    
  • 相关阅读:
    Menu-actionBarMenu字体颜色修改
    actionBarTab-actionBarTab自定义 布局没法改变其中字体相对中间的位置
    Funui-overlay 如何添加theme 的 overlay
    java进阶——反射(Reflect)
    java工具类学习整理——集合
    Java实例练习——java实现自动生成长度为10以内的随机字符串(可用于生成随机密码)
    打通Java与MySQL的桥梁——jdbc
    SQL数据库操作整理
    PhpStorm 4.0 & 5.0 部署本地Web应用
    PhpStorm 4.0 & 5.0 部署本地Web应用
  • 原文地址:https://www.cnblogs.com/Ayanowww/p/11553190.html
Copyright © 2020-2023  润新知