题解:Etéreo 的三视图

题目大意

给定一个 的三维空间,其中有 个单位立方体。要求输出该模型的三视图

  • 主视图(正视图):从前方看,显示每个 层在 方向是否有方块;
  • 左视图:题目说明“蓝色面为右视面,但输出应为左视图”,实际处理时按题意直接使用 坐标即可;
  • 俯视图:从上往下看,显示每个 层在 方向是否有方块。

输出格式要求:

  • 行:每行包含主视图( 字符) + 一个空格 + 左视图( 字符);
  • 接着一个空行;
  • 行:每行为俯视图的一行( 字符)。

其中 'x' 表示有方块,'.' 表示空。

关键观察

  1. 三视图不是投影,而是按层切片

    • 主视图:对每个固定的 ,记录哪些 位置存在至少一个方块(不管 );
    • 左视图:对每个固定的 ,记录哪些 位置存在方块(不管 );
    • 俯视图:对每个固定的 ,记录哪些 位置存在方块(不管 )。
  2. 输出顺序陷阱

    • 虽然我们用 three[0][yy-1] 存储 的信息,
    • 样例表明: 越大(越靠前),在输出中越靠上
    • 因此,主视图和左视图需倒序输出(从 )。
  3. 俯视图无需翻转

    • 样例显示 在第一行, 在第二行,故按 从小到大输出即可。

算法步骤

  1. 初始化三个二维字符数组:

    • three[0]:大小 ,存主视图;
    • three[1]:大小 ,存左视图;
    • three[2]:大小 ,存俯视图;
    • 初始全为 '.'
  2. 读入每个立方体坐标 ,并标记:

    • three[0][y-1][x-1] = 'x'
    • three[1][y-1][z-1] = 'x'
    • three[2][z-1][x-1] = 'x'
  3. 输出:

    • 主视图 + 左视图:倒序遍历 (即 y-i-1);
    • 空行;
    • 俯视图:正序遍历

代码实现

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x, y, z, n;
    cin >> x >> y >> z >> n;
    vector three(3, vector<string>());
    three[0].resize(y, string(x, '.'));
    three[1].resize(y, string(z, '.'));
    three[2].resize(z, string(x, '.'));

    for (int i = 0; i < n; i++) {
        int xx, yy, zz;
        cin >> xx >> yy >> zz;
        three[0][yy - 1][xx - 1] = 'x';
        three[1][yy - 1][zz - 1] = 'x';
        three[2][zz - 1][xx - 1] = 'x';
    }

    for (int i = 0; i < y; i++) {
        cout << three[0][y - i - 1] << " " << three[1][y - i - 1] << '\n';
    }
    cout << '\n';
    for (int i = 0; i < z; i++) {
        cout << three[2][i] << '\n';
    }
}