1 条题解

  • 0
    @ 2025-4-9 20:27:15

    题目分析

    题目描述:给定一个三维立方体堆叠结构,要求输出其旋转后的视图。具体来说,需要输出两种旋转后的视图:

    1. XX轴旋转9090度后的视图(左视图)
    2. YY轴旋转9090度后的视图(正视图)

    输入格式:输入包含多组测试数据。每组数据的第一行是一个整数nn,表示立方体的层数。接下来的nn行描述每层的立方体分布,每行以00结尾。当n=0n=0时,表示输入结束。

    输出格式:对于每组测试数据,输出两个视图,每个视图之间用空行分隔,两组测试数据之间也用空行分隔。

    算法思路

    这个问题可以通过三维数组模拟立方体的堆叠结构,然后根据旋转规则生成对应的视图。具体步骤如下:

    1. 数据结构:使用三维布尔数组map[i][j][k]map[i][j][k]表示坐标为(i,j,k)(i,j,k)的位置是否存在立方体。

    2. 输入处理:读取输入数据并填充三维数组。

    3. 视图生成

      • 左视图(绕XX轴旋转):遍历每一层,统计每一列在ZZ方向上的最大高度。
      • 正视图(绕YY轴旋转):遍历每一列,统计每一行在ZZ方向上的最大高度。
    4. 输出格式:按照题目要求的格式输出两个视图。

    代码解释

    下面是完整的题解代码,包含详细注释:

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    using namespace std;
    
    #define maxn 25
    
    int n;
    bool map[maxn][maxn][maxn];  // 三维数组存储立方体结构
    
    // 读取输入数据并填充三维数组
    void input()
    {
        memset(map, 0, sizeof(map));  // 初始化数组为0
        for (int i = 1; i <= n; i++)  // 处理每一层
        {
            int a;
            int j = 1;
            while (scanf("%d", &a), a)  // 读取每行数据,直到遇到0
            {
                for (int k = 1; k <= a; k++)  // 在当前位置堆叠a个立方体
                    map[i][j][k] = true;
                j++;  // 移动到下一列
            }
        }
    }
    
    // 处理并输出两种视图
    void work()
    {
        int i, j, k;
        
        // 输出左视图(绕$X$轴旋转)
        i = 1;
        while (map[1][1][i])  // 遍历$Z$轴方向的每一层
        {
            bool first = true;
            j = 1;
            while (map[j][1][i])  // 遍历$Y$轴方向的每一列
            {
                k = 1;
                while (map[j][k][i])  // 统计当前列在$X$方向上的最大高度
                    k++;
                k--;
                if (first)
                    first = false;
                else
                    putchar(' ');
                printf("%d", k);  // 输出当前列的高度
                j++;
            }
            i++;
            putchar('\n');  // 换行
        }
        putchar('\n');  // 视图之间的空行
        
        // 输出正视图(绕$Y$轴旋转)
        i = 1;
        while (map[1][i][1])  // 遍历$Y$轴方向的每一列
        {
            bool first = true;
            j = 1;
            while (map[1][i][j])  // 遍历$X$轴方向的每一行
            {
                k = 1;
                while (map[k][i][j])  // 统计当前行在$Z$方向上的最大高度
                    k++;
                k--;
                if (first)
                    first = false;
                else
                    putchar(' ');
                printf("%d", k);  // 输出当前行的高度
                j++;
            }
            i++;
            putchar('\n');  // 换行
        }
        putchar('\n');  // 测试数据之间的空行
    }
    
    int main()
    {
        //freopen("t.txt", "r", stdin);  // 取消注释可以从文件读取输入
        bool first = true;
        while (scanf("%d", &n), n)  // 读取多组测试数据,直到$n=0$
        {
            if (first)
                first = false;
            else
                putchar('\n');  // 测试数据之间的空行
            input();  // 读取当前测试数据
            work();   // 处理并输出视图
        }
        return 0;
    }
    

    关键部分解析

    1. 输入处理

      • 使用memsetmemset初始化三维数组为00
      • 逐行读取输入数据,每行的每个数字表示该位置堆叠的立方体数量
    2. 左视图生成

      • 遍历ZZ轴方向的每一层
      • 对于每一层,遍历YY轴方向的每一列
      • 统计每一列在XX方向上的最大高度
    3. 正视图生成

      • 遍历YY轴方向的每一列
      • 对于每一列,遍历XX轴方向的每一行
      • 统计每一行在ZZ方向上的最大高度
    4. 输出格式控制

      • 使用putchar(putchar('\n)')控制换行和空行
      • 使用firstfirst标志控制每行第一个数字前不输出空格

    这个算法通过三维数组模拟立方体结构,然后根据旋转规则生成对应的视图,时间复杂度为O(n3)O(n^3),空间复杂度为O(n3)O(n^3),适用于题目给定的输入规模。

    • 1

    信息

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