题目要求将一组三维空间中的单位立方体坐标 转化为标准的工程三视图:正视图(Front)、左视图(Left)和俯视图(Top)。

视图定义

  • 正视图 (Front View):投影到 平面。观察者沿 轴方向观察,由于输出宽度为 高度为 ,且第一行对应 的最大值,映射逻辑为 方向恒定, 方向倒序。
  • 左视图 (Left View):投影到 平面。观察者沿 轴观察,由于输出宽度为 高度为 ,映射逻辑为 方向恒定, 方向倒序。
  • 俯视图 (Top View):投影到 平面。观察者从上往下看,输出宽度为 高度为 ,映射逻辑为 方向恒定, 方向正序输出。

算法

1. 降维投影 (Projection Mapping)

鉴于三维全量网格的高空间复杂度,我们不应构建三维数组。三视图的本质是降维投影

  • 对于每一个正方体坐标 ,它对三个投影平面产生贡献。
  • 我们只需维护三个二维的“投影掩码”数组(Bitmask),通过 的开销将 个点分别映射到三个视图平面。

2. 坐标轴对齐

根据题目描述与样例输出的比例关系,建立如下映射坐标系:

  • 正视图 (Front):行映射 对应坐标 ;列映射 对应坐标
  • 左视图 (Left):行映射 对应坐标 ;列映射 对应坐标
  • 俯视图 (Top):行映射 对应坐标 ;列映射 对应坐标

复杂度分析

  • 时间复杂度
    • 坐标读取与投影,遍历 个点并更新投影数组。
    • 视图生成,遍历三个投影平面进行字符填充。
  • 空间复杂度
    • 投影矩阵:使用三个布尔矩阵,总空间为

代码实现

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int x, y, z, n;
    cin >> x >> y >> z >> n;

    vector<vector<bool>> viewXY(x + 1, vector<bool>(y + 1, false));
    vector<vector<bool>> viewYZ(y + 1, vector<bool>(z + 1, false));
    vector<vector<bool>> viewXZ(x + 1, vector<bool>(z + 1, false));

    for (int i = 0; i < n; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        viewXY[a][b] = true;
        viewYZ[b][c] = true;
        viewXZ[a][c] = true;
    }

    for (int b = y; b >= 1; b--) {
        for (int a = 1; a <= x; a++) {
            cout << (viewXY[a][b] ? 'x' : '.');
        }
        cout << " ";
        for (int c = 1; c <= z; c++) {
            cout << (viewYZ[b][c] ? 'x' : '.');
        }
        cout << "\n";
    }

    cout << "\n";

    for (int c = 1; c <= z; c++) {
        for (int a = 1; a <= x; a++) {
            cout << (viewXZ[a][c] ? 'x' : '.');
        }
        cout << "\n";
    }
}