题目要求我们输出一个 m×m 的字符矩阵(m 为奇数),其中:
+;+;+;- 填充。输入只有一个奇数 m,我们需要按要求输出这个 m×m 的矩阵。
整个问题可以归纳为:对于矩阵中的每一个位置 (i,j),判断它是否满足三个条件之一:
如果满足以上任意一个条件,就输出字符 +,否则输出 -。
因为矩阵的行和列都是从 1 开始的,我们可以使用两重循环:外层循环控制行号 i(从 1 到 m),内层循环控制列号 j(从 1 到 m)。在循环内部进行条件判断并输出相应字符,每一行输出完毕后需要换行。
for 循环,行号 i 从 1 遍历到 m:
for 循环,列号 j 从 1 遍历到 m:
j == 1 或 j == m 或 i == j,输出 +;-。\n。这种方法直接对应于题目的描述,逻辑简单清晰,不易出错。
该算法使用了两层嵌套循环,行和列各循环 m 次,因此总共需要判断 m×m 个位置。时间复杂度为 O(m2)。
根据数据范围,3≤m≤49,m 最大为 49,计算量最大不超过 49×49=2401 次,远小于时间限制 1000ms 能承受的范围,完全满足题目要求。空间复杂度方面,我们只使用了几个循环变量,没有开辟大数组,空间复杂度为 O(1)。
以下是 C++ 参考代码,并附有详细注释。
cpp1#include<bits/stdc++.h> 2using namespace std; 3 4int main() { 5 int n; // 矩阵的大小,即 m 6 cin >> n; // 读入 m 7 8 // 外层循环:遍历每一行,行号 i 从 1 到 n 9 for (int i = 1; i <= n; i++) { 10 // 内层循环:遍历该行的每一列,列号 j 从 1 到 n 11 for (int j = 1; j <= n; j++) { 12 // 判断当前位置是否需要输出 '+' 13 if (j == 1 || j == n) // 第一列 或 最后一列 14 cout << "+"; 15 else { 16 if (i == j) // 主对角线 17 cout << "+"; 18 else // 其余位置 19 cout << "-"; 20 } 21 } 22 cout << "\n"; // 每一行输出结束后换行 23 } 24 return 0; 25}
代码解释:
j == 1 || j == n:判断当前列是否为第一列或最后一列,这两种情况都需要打印 +。i == j,即是否为对角线上的元素,若是则打印 +,否则打印 -。\n 进行换行,保证矩阵的格式正确。这样写出的代码正好能够得到题目示例中 5 x 5 的 N 字矩阵。
本题考察的是对循环和条件判断的基本应用,只要能够正确识别矩阵中需要输出 + 的位置,就能很容易地解决问题。因为数据量很小,简单的模拟即可通过。希望通过此题,你能更熟练地掌握二维输出的写法。