1 条题解

  • 0
    @ 2025-8-24 21:15:12

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Maxmilite
    **

    搬运于2025-08-24 21:15:11,当前版本为作者最后更新于2023-07-16 21:11:15,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Source & Knowledge

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

    题目大意

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

    题目分析

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

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

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

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

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

    正视图

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

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

    核心代码如下:

    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;
    

    左视图

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

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

    核心代码如下:

    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;
    

    俯视图

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

    核心代码如下:

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

    视频讲解

    • 1

    信息

    ID
    8921
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者