zoukankan      html  css  js  c++  java
  • POJ2251 Dungeon Master bfs搜索

    就是将普通的二维推广到三维,方向变成了六个。

    代码如下:

    #include <cstring>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    
    int L, N, M, sx, sy, sz;
     
    struct Node
    {
        int x, y, z, t;    
    }e[100005], pos;
    
    int front, tail, dir[6][3] ={
        0, 1, 0,
        0, -1, 0,
        1, 0, 0,
        -1, 0, 0,
        0, 0, 1, 
        0, 0, -1
    };  // 六个方向,三个坐标 
    
    char G[35][35][35];
    
    bool judge(int x, int y, int z)
    {
        if (x < 1 || x > N || y < 1 || y > M || z < 1 || z > L) {
            return false;
        }    
        else {
            return true;
        }
    }
    
    int bfs()
    {
        int xx, yy, zz;
        front = 0;
        tail = 1;
        e[tail].x = sx, e[tail].y = sy;
        e[tail].z = sz,e[tail].t = 0;
        while (front != tail) {
            pos = e[++front];
            for (int i = 0; i < 6; ++i) {
                xx = pos.x + dir[i][0];
                yy = pos.y + dir[i][1];
                zz = pos.z + dir[i][2];
                if (judge(xx, yy, zz)) {
                    if (G[zz][xx][yy] == '.') {
                        ++tail;
                        e[tail].x = xx, e[tail].y = yy;
                        e[tail].z = zz, e[tail].t = pos.t + 1;        
                        G[zz][xx][yy] = '#';
                    }
                    else if (G[zz][xx][yy] == 'E') {
                        return pos.t + 1;
                    }
                }
            }
        }
        return -1;
    }
    
    int main()
    {
        int flag, ans;
        while (scanf("%d %d %d", &L, &N, &M), L|N|M) {
            flag = 0;
            for (int i = 1; i <= L; ++i) {
                for (int j = 1; j <= N; ++j) {
                    scanf("%s", G[i][j]+1);
                    for (int k = 1; k <= M && !flag; ++k) {
                        if (G[i][j][k] == 'S') {
                            sx = j, sy = k, sz = i;
                            G[i][j][k] = '#';
                            flag = 1;
                            break;
                        }
                    }
                }
            }
            ans = bfs();
            if (ans == -1) {
                printf("Trapped!\n");
            }
            else {
                printf("Escaped in %d minute(s).\n", ans);
            }
        }
        return 0;        
    }
  • 相关阅读:
    h5 input调起摄像头、摄像机、录音机
    基数排序
    快速排序 && 希尔排序 && 插入排序
    堆排序
    归并排序(Merge sort)
    动态规划:背包问题
    Chap5: question: 29
    排列 && 组合
    Chap4: question: 19
    Chap3: question: 11
  • 原文地址:https://www.cnblogs.com/Lyush/p/2590384.html
Copyright © 2011-2022 走看看