题目要求我们根据给定的奇数 N,输出一个 N×N 的字符矩阵。矩阵具有如下特征:
|。-。a。以 N=5 为例,矩阵的形状为:
|aaa|
|aaa|
|---|
|aaa|
|aaa|
题目保证 N 为奇数且 5≤N≤49,规模很小,直接模拟即可。
我们可以将矩阵的构造拆分为边框和内部内容两部分:
|,这点对所有行都成立。-。a。因此,我们只需要循环 N 次,每次输出一行。在每一行中:
|;- 还是 N−2 个 a;| 并换行。由于 N 最大只有 49,无论是直接判断还是分段循环都不会超时。
使用一重循环遍历行号 i(从 1 到 N),行内再循环输出中间的 N−2 个字符。如果是中间行输出 -,否则输出 a。
参考代码:
cpp1#include <cstdio> 2 3int main() { 4 int n; 5 scanf("%d", &n); 6 int mid = (n + 1) / 2; // 计算中间行的行号 7 for (int i = 1; i <= n; i++) { 8 putchar('|'); // 左边界 9 for (int j = 2; j <= n - 1; j++) { 10 if (i == mid) 11 putchar('-'); 12 else 13 putchar('a'); 14 } 15 putchar('|'); // 右边界 16 putchar('\n'); 17 } 18 return 0; 19}
先输出上半部分(第 1 行到中间行的前一行),再输出中间行,最后输出下半部分(中间行的后一行到第 N 行)。这样可以在每一段内使用固定的字符,避免了每次都做条件判断。
题目参考代码分析:
cpp1#include <stdio.h> 2 3int main(int argc, char **argv) 4{ 5 int n, i, j; 6 scanf("%d", &n); 7 // 上半部分:第 1 行到 (n+1)/2 - 1 行 8 for(i=1; i<=(n+1)/2-1; i++) 9 { 10 printf("|"); 11 for(j=2; j<=n-1; j++) 12 { 13 printf("a"); 14 } 15 printf("|\n"); 16 } 17 // 中间行:第 (n+1)/2 行 18 printf("|"); 19 for(j=2; j<=n-1; j++) 20 { 21 printf("-"); 22 } 23 printf("|\n"); 24 25 // 下半部分:第 (n+1)/2+1 行到第 n 行 26 for(i=(n+1)/2+1; i<=n; i++) 27 { 28 printf("|"); 29 for(j=2; j<=n-1; j++) 30 { 31 printf("a"); 32 } 33 printf("|\n"); 34 } 35 return 0; 36}
代码中:
(n+1)/2 表示中间行的行号。a。-。无论采用哪种方法,都需要输出 N 行,每行输出 N 个字符(包括循环内部的输出),因此总操作次数为 O(N2)。考虑到 N≤49,N2 最多为 2401,远小于时间限制,完全可以在瞬间完成。
\n(C++ 中的 endl 也可以,但 \n 效率更高)。a 是小写,减号是半角 -,竖线是 |,不要打错字符。本题主要考查循环结构与条件判断的运用,难度不大,适合初学者练习输出格式的控制。