题解:Etéreo 的三视图
题目大意
给定一个 的三维空间,其中有
个单位立方体。要求输出该模型的三视图:
- 主视图(正视图):从前方看,显示每个
层在
方向是否有方块;
- 左视图:题目说明“蓝色面为右视面,但输出应为左视图”,实际处理时按题意直接使用
坐标即可;
- 俯视图:从上往下看,显示每个
层在
方向是否有方块。
输出格式要求:
- 前
行:每行包含主视图(
字符) + 一个空格 + 左视图(
字符);
- 接着一个空行;
- 再
行:每行为俯视图的一行(
字符)。
其中 'x' 表示有方块,'.' 表示空。
关键观察
-
三视图不是投影,而是按层切片:
- 主视图:对每个固定的
,记录哪些
位置存在至少一个方块(不管
);
- 左视图:对每个固定的
,记录哪些
位置存在方块(不管
);
- 俯视图:对每个固定的
,记录哪些
位置存在方块(不管
)。
- 主视图:对每个固定的
-
输出顺序陷阱:
- 虽然我们用
three[0][yy-1]存储的信息,
- 但样例表明:
越大(越靠前),在输出中越靠上。
- 因此,主视图和左视图需倒序输出(从
到
)。
- 虽然我们用
-
俯视图无需翻转:
- 样例显示
在第一行,
在第二行,故按
从小到大输出即可。
- 样例显示
算法步骤
-
初始化三个二维字符数组:
three[0]:大小,存主视图;
three[1]:大小,存左视图;
three[2]:大小,存俯视图;
- 初始全为
'.'。
-
读入每个立方体坐标
,并标记:
three[0][y-1][x-1] = 'x'three[1][y-1][z-1] = 'x'three[2][z-1][x-1] = 'x'
-
输出:
- 主视图 + 左视图:倒序遍历
(即
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';
}
}

京公网安备 11010502036488号