题解
字母X
1 条题解
-
0
解题思路
我们要输出一个高、宽都是 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