1 条题解

  • 0
    @ 2025-4-14 21:42:24

    算法标签:

    bfs

    题解:

    使用三维布尔数组cube[MAXN][MAXN][MAXN]来记录每个网格位置是否存在 ACM 模块,MAXN设为 65(略大于题目给定的最大尺寸 60)。三维布尔数组visited[MAXN][MAXN][MAXN]用于记录在搜索过程中每个网格位置是否被访问过。定义结构体Point来表示三维空间中的点,包含x、y、z三个坐标。使用队列queue q来辅助广度优先搜索。广度优先搜索(BFS):从网格的起始位置(0, 0, 0)开始进行 BFS。将起始点加入队列并标记为已访问。在 BFS 循环中,每次从队列中取出一个点cur,遍历其六个相邻方向(通过dx、dy、dz数组表示六个方向的偏移量)。对于每个相邻点(newX, newY, newZ):首先检查该点是否在网格范围内(通过isValid函数判断)。如果该点在范围内且对应位置存在 ACM 模块(即cube[newX][newY][newZ]为true),则说明当前点与 ACM 模块相邻,需要额外屏蔽的面数量count加 1。如果该点在范围内且未被访问过(即!visited[newX][newY][newZ])且该位置没有 ACM 模块(即!cube[newX][newY][newZ]),则将该点加入队列并标记为已访问,以便后续继续搜索。

    #include <iostream>
    #include <cstring>
    #include <queue>
    #define CL(x, y) memset(x,y,sizeof(x))
    using namespace std;
    const int MAX = 66;
    int A, B, C, D, num;
    int used[MAX][MAX][MAX];
    int tower[MAX][MAX][MAX];
    int Move[6][3]= {{1,0,0},{0,1,0},{0,0,1},{-1,0,0},{0,-1,0},{0,0,-1}};
    bool check(int x, int y, int z);
    struct node
    {
        int x, y, z;
    };
    void BFS();
    queue <node> Q;
    node madeQueue(int xx,int yy,int zz)
    {
        node rear;
        rear.x = xx;
        rear.y = yy;
        rear.z = zz;
        return rear;
    }
    int main()
    {
        while(cin >> A >> B >> C >> D)
        {
            if(!A && !B && !C && !D) break;
            CL(tower, 0);
            CL(used, 0);
            int temp;
            for(int j = 0; j < D; j++)
            {
                cin >> temp;
                tower[temp%(B*A)%A+1][temp%(B*A)/A+1][temp/(A*B)+1] = 1;
            }
            BFS();
            cout << "The number of faces needing shielding is " << num << ".\n";
        }
        return 0;
    }
    void BFS()
    {
        num = 0;
        Q.push(madeQueue(0,0,0));
        while(!Q.empty())
        {
            node cur = Q.front();
            Q.pop();
            if(used[cur.x][cur.y][cur.z]) continue;
            used[cur.x][cur.y][cur.z] = 1;
            if(cur.x >= 1)
            {
                if(!tower[cur.x-1][cur.y][cur.z])
                {
                    if(!used[cur.x-1][cur.y][cur.z])
                    {
                        Q.push(madeQueue(cur.x-1,cur.y,cur.z));
                    }
                }
                else num++;
            }
            if(cur.x <= A)
            {
                if(!tower[cur.x+1][cur.y][cur.z])
                {
                    if(!used[cur.x+1][cur.y][cur.z])
                    {
                        Q.push(madeQueue(cur.x+1,cur.y,cur.z));
                    }
                }
                else num++;
            }
            if(cur.y >= 1)
            {
                if(!tower[cur.x][cur.y-1][cur.z])
                {
                    if(!used[cur.x][cur.y-1][cur.z])
                    {
                        Q.push(madeQueue(cur.x,cur.y-1,cur.z));
                    }
                }
                else num++;
            }
            if(cur.y <= B)
            {
                if(!tower[cur.x][cur.y+1][cur.z])
                {
                    if(!used[cur.x][cur.y+1][cur.z])
                    {
                        Q.push(madeQueue(cur.x,cur.y+1,cur.z));
                    }
                }
                else num++;
            }
            if(cur.z >= 1)
            {
                if(!tower[cur.x][cur.y][cur.z-1])
                {
                    if(!used[cur.x][cur.y][cur.z-1])
                    {
                        Q.push(madeQueue(cur.x,cur.y,cur.z-1));
                    }
                }
                else num++;
            }
            if(cur.z <= C)
            {
                if(!tower[cur.x][cur.y][cur.z+1])
                {
                    if(!used[cur.x][cur.y][cur.z+1])
                    {
                        Q.push(madeQueue(cur.x,cur.y,cur.z+1));
                    }
                }
                else num++;
            }
        }
        while(!Q.empty())
            Q.pop();
    }
    bool check(int x, int y, int z)
    {
        if(x >= 0 && x <= A+1 && y >= 0 && y <= B+1 && z >= 0 && z <= C+1)
            return true;
        return false;
    }
    
    • 1

    信息

    ID
    97
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者