[语言月赛 202307] Three-View Projection 题解

· · 题解

Source & Knowledge

2023 年 7 月语言月赛,由洛谷网校入门计划/基础计划提供。

题目大意

给定一个 n \times m \times 1 的空间中,小正方体的分布情况。求这个空间形状的三视图。

题目分析

本题难点在于较为复杂的坐标转换。

我们首先定义,按照 x 轴区分的,每一条从前往后的区域叫做;按照 y 轴区分的,每一条从左向右的区域叫做

我们如果使用如下方式进行读入:

for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= m; ++j)
        cin >> a[i][j];

那么我们是按照从左向右的顺序读入的每一的信息。因此,a 数组的第一维代表列(x 轴)信息,第二维代表行(y 轴)信息。且顺序为,从左向右,从前向后。因此,我们在输出三视图时需要考虑这个问题。

正视图

正视图要求从左向右。显然输出的是每一列的情况,因此我们首先需要正序枚举第一维(列,x 轴)。

在每一列中,我们统计这一列是否出现过正方体,如果出现过则在当前位置输出 1,否则输出 0

核心代码如下:

for (int i = 1; i <= n; ++i) {
    int x = 0;
    for (int j = 1; j <= m; ++j) {
        if (a[i][j] == 1)
            x = 1;
    }
    cout << x << " ";
}
cout << endl;

左视图

左视图要求从后向前。显然输出的是每一行的情况,因此我们首先需要倒序枚举第二维(行,y 轴)。

在每一行中,我们统计这一行是否出现过正方体,如果出现过则在当前位置输出 1,否则输出 0

核心代码如下:

for (int j = m; j >= 1; --j) {
    int x = 0;
    for (int i = 1; i <= n; ++i) {
        if (a[i][j] == 1)
        x = 1;
    }
    cout << x << " ";
}
cout << endl;

俯视图

左视图要求从后向前从左向右。因此我们首先需要倒序枚举第二维(行,y 轴),其次正序枚举第一维(列,x 轴)。在枚举中,输出每一格的情况即可。

核心代码如下:

for (int j = m; j >= 1; --j) {
    for (int i = 1; i <= n; ++i) {
        cout << a[i][j] << " "; 
    }
    cout << endl;
}

视频讲解