zoukankan      html  css  js  c++  java
  • hdu2102 BFS

            这是一道BFS的搜索题目,只是搜索范围变为了三维。定义数组visit[x][y][z]来标记空间位置,x表示楼层,y和z表示相应楼层的平面坐标。

    #define _CRT_SECURE_NO_DEPRECATE
    #include<iostream>
    using namespace std;
    #include<queue>
    #define MAX_SIZE 12
    int N, M, T;
    char visit[2][MAX_SIZE][MAX_SIZE];
    char map[2][MAX_SIZE][MAX_SIZE];
    int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
    struct Point{
        int x, y, z, step;
        bool Isleg() {
            if ( y<0 || y>N-1||z<0||z>M-1||map[x][y][z]=='*'||visit[x][y][z])
                return false;
            return true;
        }
    };
    int BFS();
    int main() {
        int i,c,res;
        scanf("%d", &c);
        while(c--){
            scanf("%d%d%d", &N, &M, &T);
            for (i = 0; i <N; i++)
                scanf("%s", map[0][i]);
            for (i =0; i < N;i++)
                scanf("%s",map[1][i]);
            res = BFS();
            if (res <= T)
                printf("YES
    ");
            else
                printf("NO
    ");
        }
        return 0;
    }
    int BFS() {
        Point next, pos;
        int k,i,j;
        for (i = 0; i < 2; i++) {
            for (k = 0; k <N; k++)
                for (j = 0; j <M; j++)
                    visit[i][k][j] = 0;
        }
        pos.x = 0, pos.y = 0,pos.z=0;     //入口位置
        pos.step = 0;
        queue<Point>Q;
        Q.push(pos);                      //入口位置首先入队
        visit[pos.x][pos.y][pos.z] = 1;   //入口位置标记为访问
        while (!Q.empty()) {
            pos = Q.front();
            Q.pop();
            if (map[pos.x][pos.y][pos.z] == 'P')
                return  pos.step;
            pos.step++;
            if (map[pos.x][pos.y][pos.z] == '#') {
                next = pos;
                next.x = (next.x + 1) % 2;       //进入下一层
                if (next.Isleg()) {
                    visit[next.x][next.y][next.z] = 1;
                    next.step--;         //时空传输不发费时间
                    Q.push(next);
                }
            }
            else {
                for (k = 0; k < 4; k++) {     //扫描四个方向
                    next = pos;
                    next.y += dir[k][0];
                    next.z += dir[k][1];
                    if (next.Isleg()) {
                        visit[next.x][next.y][next.z] = 1;
                        Q.push(next);
                    }
                }
            }
        }
        return INT_MAX;
    }
  • 相关阅读:
    linux--文件夹下批量改动IP
    Effective C++ 条款24
    ARMv8 Linux内核异常处理过程分析
    VS2010升级VS2013后,出现没有定义类型“PowerPacks.ShapeContainer”错误解决方法
    利用Nginx构建负载均衡server
    getline与get函数的区别
    Linking Containers Together
    获取不同机型外置SD卡路径
    查看linux系统状态
    Linux 开机自检的设置(tune2fs和fsck)
  • 原文地址:https://www.cnblogs.com/td15980891505/p/5345640.html
Copyright © 2011-2022 走看看