zoukankan      html  css  js  c++  java
  • POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

      POJ 2251

      题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间。不同L层的地图,相同RC坐标处是相连通的。(.可走,#为墙)

      解题思路:从起点开始分别往6个方向进行BFS(即入队),并记录步数,直至队为空.若一直找不到,则困住。

    /* POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路) */
    #include <cstdio>
    #include <cstring>
    #include <queue>
    using namespace std;
    
    int n, m, o; //n行m列,o为层
    char mapp[31][31][31];
    bool visit[31][31][31]; //标记访问状态
    
    /* 构造队列元素 (点位置+步数)*/
    struct Point{
        int x, y, z;
        int step;
        Point(){}
        Point(int a, int b, int c, int d) :x(a), y(b), z(c), step(d){}
    };
    
    /* 判断点是否满足访问条件 */
    inline bool judge(Point tmp){
        if (mapp[tmp.x][tmp.y][tmp.z] == '#' || visit[tmp.x][tmp.y][tmp.z]
            || tmp.x < 0 || tmp.x >= o || tmp.y < 0 || tmp.y >= n
            || tmp.z < 0 || tmp.z >= m
            ){
            return 0;
        }
        return 1;
    }
    
    /* x0为深度 y0,z0为同一层坐标 */
    void bfs(int x0, int y0,int z0){
        queue<Point> q;
        bool found = 0;
        visit[x0][y0][z0] = 1;  //起点标记已访问
        q.push(Point(x0, y0, z0, 0));
        while (!q.empty()){
            Point tmp = q.front(); q.pop();
            if (mapp[tmp.x][tmp.y][tmp.z] == 'E'){
                //找到终点,搜索结束,输出最短路
                printf("Escaped in %d minute(s).
    ", tmp.step);
                found = 1;
                break;
            }
            else{
                Point tmp2;
                ++tmp.step; //步数必定增加
    
                //往上一层
                tmp2 = tmp;
                tmp2.x = tmp.x - 1;
                if (judge(tmp2)){
                    visit[tmp2.x][tmp2.y][tmp2.z] = 1;
                    q.push(tmp2);
                }
                
                //往下一层
                tmp2 = tmp;
                tmp2.x = tmp.x + 1;
                if (judge(tmp2)){
                    visit[tmp2.x][tmp2.y][tmp2.z] = 1;
                    q.push(tmp2);
                }
                
                //以下四种为同一层
    
                //往上一行
                tmp2 = tmp;
                tmp2.y = tmp.y - 1;
                if (judge(tmp2)){
                    visit[tmp2.x][tmp2.y][tmp2.z] = 1;
                    q.push(tmp2);
                }
    
                //往下一行
                tmp2 = tmp;
                tmp2.y = tmp.y + 1;
                if (judge(tmp2)){
                    visit[tmp2.x][tmp2.y][tmp2.z] = 1;
                    q.push(tmp2);
                }
                
                //往左一列
                tmp2 = tmp;
                tmp2.z = tmp.z - 1;
                if (judge(tmp2)){
                    visit[tmp2.x][tmp2.y][tmp2.z] = 1;
                    q.push(tmp2);
                }
                
                //往右一列
                tmp2 = tmp;
                tmp2.z = tmp.z + 1;
                if (judge(tmp2)){
                    visit[tmp2.x][tmp2.y][tmp2.z] = 1;
                    q.push(tmp2);
                }
                
            }//else
        }//while
        if (!found){
            printf("Trapped!
    ");
        }
    }
    
    int main()
    {
    #ifdef _LOCAL
        freopen("D:\input.txt", "r", stdin);
    #endif
    
        int sx, sy, sz;
        while (scanf("%d%d%d", &o, &n, &m) == 3 && (m + n + o)){
            memset(visit, 0, sizeof visit);
            for (int i = 0; i < o; ++i){
                for (int j = 0; j < n; ++j){
                    scanf("%s", mapp[i][j]);
                    for (int k = 0; k < m; ++k){
                        if (mapp[i][j][k] == 'S'){
                            sx = i;
                            sy = j;
                            sz = k;
                        }
                    }//for(k)
                }//for(j) n行
            }//for(i) o层
            bfs(sx, sy, sz); //sx是深度
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    学校的破网,你别再掉了
    PhotoShop SDK的获取
    我的C++博客开张了
    一个新的嵌入式门户
    试用Bloglines.com
    PhotoShop的插件体系
    VB6 to VB.NET Migration Guide Community Preview #4
    看看Microsoft都买了些什么
    Borland CTO辞职
    PhotoShop插件的开发
  • 原文地址:https://www.cnblogs.com/tommychok/p/5184498.html
Copyright © 2011-2022 走看看