1 条题解

  • 0
    @ 2025-4-14 22:07:10

    算法标签:

    模拟

    题解:

    我们很容易发现,题目要求输出的图中如果先不管 H-O 键的话,也就是说光看 H 和 O 原子的话,它们的位置是有规律的,H 原子分两种,一种是从点(2,2)开始横,纵坐标分别以 4 递增,另一种是从点(4,4)开始横,纵坐标分别以 4 递增。而 O 原子的个数就是 n*n ,从(2,4)开始,以 4 递增。我们可以先画出一张没有 H-O 键的图来,然后在根据 数字矩阵中的值,给每一个 O 原子加上两个 H-O 键就可以了。

    最后加上 H-O 键的时候,按 数字矩阵 分3种情况,1 和 -1 时,很好处理,关键是 0 的时候。仔细看题,有这么一句话: ……the sum of each row and column is 1 ……

    就是这句了,解题点,根据 数字矩阵 中该行(或列)上 从开始到现在的点的数值和,可以判断,这个 H-O 键的方向:

    上下:该列第一行到该行的数值和,0代表 H-O 在这个 O 原子下面,1是上。

    左右:该行第一列到该列的数值和,0代表 H-O 在这个 O 原子左面,1是右。

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int in[15][15];
    char out[50][50];
    
    int main() {
        int num, m;
        int rpo, cpo, iuh;
        int i, j;
        num = 1;
        while (cin >> m && m != 0) {
            memset(out, 0, sizeof(out));
            if (num > 1) cout << endl;
            cout << "Case " << num++ << ":\n\n";
            for (i = 0; i < m; i++)
                for (j = 0; j < m; j++)
                    cin >> in[i][j];
            rpo = 0;
            for (i = 0; i < m; i++) {
                cpo = 0;
                for (j = 0; j < m; j++) {
                    if (in[i][j] == 0) {
                        if (cpo == 0 || out[rpo][cpo - 2] != 'H') {
                            if (rpo == 0 || out[rpo - 2][cpo + 2] == 'H') iuh = 1;
                            else iuh = -1;
                            memcpy(out[rpo] + cpo, "H-O ", sizeof(char) * 4);
                            memcpy(out[rpo + iuh] + cpo, "  | ", sizeof(char) * 4);
                            memcpy(out[rpo + iuh * 2] + cpo, "  H ", sizeof(char) * 4);
                        } else {
                            if (rpo == 0 || out[rpo - 2][cpo] == 'H') iuh = 1;
                            else iuh = -1;
                            memcpy(out[rpo] + cpo, "O-H ", sizeof(char) * 4);
                            memcpy(out[rpo + iuh] + cpo, "|   ", sizeof(char) * 4);
                            memcpy(out[rpo + iuh * 2] + cpo, "H   ", sizeof(char) * 4);
                        }
                        cpo += 4;
                    } else if (in[i][j] == 1) {
                        memcpy(out[rpo] + cpo, "H-O-H ", sizeof(char) * 6);
                        cpo += 6;
                    } else if (in[i][j] == -1) {
                        memcpy(out[rpo - 2] + cpo, "H ", sizeof(char) * 2);
                        memcpy(out[rpo - 1] + cpo, "| ", sizeof(char) * 2);
                        memcpy(out[rpo] + cpo, "O ", sizeof(char) * 2);
                        memcpy(out[rpo + 1] + cpo, "| ", sizeof(char) * 2);
                        memcpy(out[rpo + 2] + cpo, "H ", sizeof(char) * 2);
                        cpo += 2;
                    }
                }
                rpo += 4;
            }
            for (i = 0; i < 4 * m + 3; i++)
                cout << "*";
            cout << endl;
            for (i = 0; i < 4 * m - 3; i++) {
                cout << "*";
                for (j = 0; j < 4 * m + 1; j++) {
                    if (out[i][j] != '\0') cout << out[i][j];
                    else cout << " ";
                }
                cout << "*" << endl;
            }
            for (i = 0; i < 4 * m + 3; i++)
                cout << "*";
            cout << endl;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    100
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者