• PAT(Advanced Level)A1091. Acute Stroke


    题意

    其实就是一个三维BFS的问题,计算满足大小的块(>=T)一共有几个

    思路

    • 其实就是二维BFS扩展到三维空间的情况,无非就是把本来二维上扩展4个方向改成扩展6个方向
    const int dx[] = {0, -1, 0, 1, 0, 0};
    const int dy[] = {-1, 0, 1, 0, 0, 0};
    const int dz[] = {0, 0, 0, 0, 1, -1};
    
    • 统计入队元素,看有没有>=T即可。几乎就是裸模板题了~

    代码

    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <vector>
    #include <queue>
    using namespace std;
    const int dx[] = {0, -1, 0, 1, 0, 0};
    const int dy[] = {-1, 0, 1, 0, 0, 0};
    const int dz[] = {0, 0, 0, 0, 1, -1};
    struct Node{
        int x, y, z;
    };
    
    int cub[1300][150][80] = {0};
    bool vis[1300][150][80] = {false};
    int M, N, L, T;
    int level = 0;
    int sum = 0;
    bool judge(int x, int y, int z)
    {
        if(x < 0 || x >= M ||
           y < 0 || y >= N ||
           z < 0 || z >= level)
            return false;
        if(cub[x][y][z] == 0 || vis[x][y][z] == true)   return false;
        return true;
    }
    void bfs(int x, int y, int z)
    {
        int cur_sum = 1;
        Node cur;
        cur.x = x; cur.y = y; cur.z = z;
        queue<Node> q;
        q.push(cur);
        vis[x][y][z] = true;
        while(!q.empty())
        {
            auto tmp = q.front();
            q.pop();
            for(int i=0;i<6;i++)
            {
                int tx = tmp.x + dx[i];
                int ty = tmp.y + dy[i];
                int tz = tmp.z + dz[i];
                if(judge(tx, ty, tz))
                {
                    vis[tx][ty][tz] = true;
                    cur.x = tx, cur.y = ty, cur.z = tz;
                    q.push(cur);
                    cur_sum++;
                }
            }
        }
        if(cur_sum >= T)
            sum += cur_sum;
    }
    
    int main()
    {
        cin >> M >> N >> L >> T;
        while(L--)
        {
            for(int i=0;i<M;i++)
                for(int j=0;j<N;j++)
                    scanf("%d", &cub[i][j][level]);
            level++;
        }
        for(int k=0;k<level;k++)
            for(int i=0;i<M;i++)
                for(int j=0;j<N;j++)
                        if(cub[i][j][k] == 1 && !vis[i][j][k])
                            bfs(i, j, k);
        cout << sum << endl;
        return 0;
    }
    
    
  • 相关阅读:
    关于debug和release 以及new 和delete
    关于new 和delete
    构造函数为什么不能是虚函数
    大端小端【转载】
    “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
    memset memcpy函数
    漫谈递归
    scanf 和cin 的区别
    enum枚举类型 的用法
    关于浮点数和字面值常量 的使用—— 学习汇编的重要性
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/13742361.html
Copyright © 2020-2023  润新知