题目要求将一组三维空间中的单位立方体坐标 转化为标准的工程三视图:正视图(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";
}
}

京公网安备 11010502036488号