题目要求我们根据输入的正整数 n,绘制一个 n×n 的字符正方形。正方形的边框由不同字符组成,内部填充特定字符。我们需要根据当前坐标 (i,j) 所处的位置来决定输出什么字符:
+-|*例如,当 n=5 时,输出应为:
+---+
|***|
|***|
|***|
+---+
题目保证 n≥3,因此正方形至少为 3×3,一定有内部区域,无需处理 n<3 的特殊情况。
我们可以将输出看作一个二维字符矩阵,行号和列号均从 0 到 n−1。对于每个位置 (i,j),根据以下优先级判断应输出的字符:
+。-。|。*。由于我们采用二重循环遍历所有行列,只需将上述条件转化为 if-else 判断即可依次输出每个字符,每行结束时输出换行。
i 从 0 到 n−1,表示行号。j 从 0 到 n−1,表示列号。j == 0 || j == n-1):
'+',否则输出 '|'。'-';'*'。该方法的判断逻辑清晰,覆盖所有情况且无遗漏。
算法采用双重循环,总共访问 n×n 个位置,每个位置进行常数次判断和输出操作。因此时间复杂度为 O(n2)。对于 n≤100 的数据规模,运算量至多为一万次,完全可以在 1 秒内完成,满足题目要求。空间复杂度为 O(1),仅使用了几个循环变量。
下面是 C++ 实现,代码中包含详细注释,帮助理解每一步。
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int n; 6 cin >> n; 7 8 // 外层循环控制行 9 for (int i = 0; i < n; i++) { 10 // 内层循环控制列 11 for (int j = 0; j < n; j++) { 12 // 情况1:当前列是左边界或右边界 13 if (j == 0 || j == n - 1) { 14 // 进一步判断是否为顶角或底角 15 if (i == 0 || i == n - 1) 16 cout << '+'; // 四个顶点 17 else 18 cout << '|'; // 左右边框(除顶点外) 19 } 20 // 情况2:当前列不是边界,说明在中间列 21 else { 22 // 判断是否为第一行或最后一行 23 if (i == 0 || i == n - 1) 24 cout << '-'; // 上下边框 25 else 26 cout << '*'; // 内部区域 27 } 28 } 29 // 如果不是最后一行,则输出换行 30 if (i != n - 1) 31 cout << endl; 32 } 33 34 return 0; 35}
代码说明:
i 表示行索引,j 表示列索引,均从 0 开始。0 列或第 n-1 列),再结合行位置决定输出 '+' 还是 '|'。'-' 或 '*'。i != n - 1 来避免末尾多余空行。本题属于简单的模拟输出题,关键在于正确划分不同打印区域,并合理设置条件判断的顺序以覆盖所有情况。对于初学者而言,熟悉二维坐标与边界的关系、掌握多重 if-else 的嵌套逻辑是解题的核心。通过本题可以锻炼循环控制和条件分支的基本功。