本题要求我们根据输入的奇数 (N),打印一个 (N \times N) 的“日字矩阵”。矩阵的构成规则非常明确:
|。-。x。题目保证 (5 \le N \le 49) 且 (N) 为奇数,因此不存在中间行不确定的情况。
这是一个典型的按规则填充矩阵并输出的问题。由于 (N) 的范围很小,我们完全可以使用双重循环直接判断每个位置应该输出什么字符。
我们使用行号 (i) 和列号 (j) 来遍历整个矩阵,行列均从 (0) 开始计数。对于每个位置 ((i, j)):
|。-。x。每输出完一行后,记得换行。
算法的核心在于两层嵌套循环:
i 从 0 到 N-1,控制行。j 从 0 到 N-1,控制列。if-else 判断当前位置的字符并直接输出。判断逻辑的优先级可以自由安排,只要符合题目规则即可。参考代码采用了先判断列是否为边界,再判断行是否为特殊行,最后处理剩余位置。
算法使用了两层循环,分别遍历 (N) 行和 (N) 列,总操作次数为 (N \times N)。每次循环内部进行常数次简单的条件判断和输出。
时间复杂度为 (O(N^2)),空间复杂度为 (O(1))。对于 (N \le 49) 的数据范围,完全可以在瞬间运行完成,满足时间限制。
下面是完整的 C++ 代码实现,与题目提供的参考代码一致。
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int n; 6 cin >> n; // 输入 N,保证为奇数 7 8 // 外层循环控制行 9 for (int i = 0; i < n; ++i) { 10 // 内层循环控制列 11 for (int j = 0; j < n; ++j) { 12 char ch; 13 14 // 判断是否为最左列或最右列 15 if (j == 0 || j == n - 1) { 16 ch = '|'; 17 } 18 // 判断是否为第一行、最后一行或中间一行(注意 i 从 0 开始,中间行为 n/2) 19 else if (i == 0 || i == n - 1 || i == n / 2) { 20 ch = '-'; 21 } 22 // 其余位置填充 'x' 23 else { 24 ch = 'x'; 25 } 26 27 cout << ch; // 输出当前字符 28 } 29 cout << endl; // 每行结束换行 30 } 31 32 return 0; 33}
i 代表当前行号(从 0 开始),j 代表当前列号(从 0 开始)。j == 0 或 j == n - 1 → 输出 |。i == 0 或 i == n - 1,或中间行 i == n / 2(因为 (n) 为奇数,整数除法刚好得到从 0 计数的中间行索引)→ 输出 -。x。这样就能正确打印出题目要求的“日字矩阵”了。