top1编程
← 返回题目
题解

字母X

1 条题解

  • 0
    @ 2026-8-5 10:24:13

    解题思路

    我们要输出一个高、宽都是 2n+1 的方阵,里面用星号拼出一个大大的"X"。

    "X"其实就是两条对角线:

    • 主对角线:行号等于列号,也就是 i == j;
    • 副对角线:行号加列号等于 2n+2,也就是 i + j == 2n + 2。

    只要格子落在其中一条对角线上,就输出星号 *,否则输出空格。

    题目还要求在指定的 (r, c) 位置上写上数字 7,作为"防伪标识"。7 的优先级比星号高:如果这一格被指定放 7,就输出 7,不管它是不是在对角线上。

    实现方法:先把 n 个 7 的位置记到一个二维标记数组里,然后一层一层、一列一列地输出方阵。输出时先看这一格要不要放 7,再看是不是对角线上的星号。

    有一个容易踩的小坑:n 最大是 20,方阵边长最大是 41,而 7 的位置坐标也可以到 41。如果把标记数组只开成 41×41,访问坐标 41 就越界了!所以数组要开得大一点,比如 45×45。

    参考代码

    // P4517 字母X:输出2n+1行的X形星阵,指定位置放数字7
    #include <iostream>
    using namespace std;
    
    int main() {
        int n;
        cin >> n;
        int size = 2 * n + 1;    // 方阵的边长
        int mark[45][45] = {0};  // mark记录7的摆放位置(坐标最大可达41,开大避免越界)
        for (int i = 0; i < n; i++) {
            int r, c;
            cin >> r >> c;
            mark[r][c] = 1;
        }
        for (int i = 1; i <= size; i++) {
            for (int j = 1; j <= size; j++) {
                if (mark[i][j]) {
                    cout << '7';                 // 7优先于星号
                } else if (i == j || i + j == size + 1) {
                    cout << '*';                 // 主对角线或副对角线画星号
                } else {
                    cout << ' ';
                }
            }
            cout << endl;
        }
        return 0;
    }
    

    复杂度分析

    要输出 (2n+1) 行,每行 (2n+1) 个字符,所以是两层循环,时间复杂度是 O((2n+1)²) = O(n²)。标记数组的大小是固定的,空间复杂度是 O(1)。

    • 1