题目要求我们输出一个 N×N 的“X 字矩阵”,其中 N 是给定的奇数(5 ≤ N ≤ 49)。矩阵的两条对角线(主对角线和副对角线)上的字符是 +,其余位置为 -。
例如 N=5 时:
+---+
-+-+-
--+--
-+-+-
+---+
我们需要编写程序,按照格式输出这个矩阵:共 N 行,每行 N 个字符,不包含多余的空格或空行。
这是一个典型的双层循环控制输出的问题。关键在于判断当前位置 (i, j) 是否属于对角线。
设行号为 i(从 0 到 N-1),列号为 j(从 0 到 N-1),则:
i == j。i + j == N - 1。当满足上述任意一个条件时,当前位置输出 +,否则输出 -。
因此,我们可以使用嵌套的 for 循环:
该方法简单直观,容易实现。
根据思路,可以写出核心判断逻辑:
if (i == j || i + j == N - 1)
输出 '+'
else
输出 '-'
以 N=5 为例,行列坐标和对角线的关系如下表(满足对角线条件的位置标为 +):
| i\j | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | + | + | |||
| 1 | + | + | |||
| 2 | + | ||||
| 3 | + | + | |||
| 4 | + | + |
(表中 + 位置即 i==j 或 i+j==4)
我们只需按行遍历并打印即可。
以下是 C++ 的实现,并附有详细注释。
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int n; 6 cin >> n; // 输入矩阵大小 N,保证奇数 7 8 // 外层循环控制行 i 9 for (int i = 0; i < n; i++) { 10 // 内层循环控制列 j 11 for (int j = 0; j < n; j++) { 12 // 如果当前位置在主对角线或副对角线上 13 if (i == j || i + j == n - 1) { 14 cout << "+"; 15 } else { 16 cout << "-"; 17 } 18 } 19 // 每行输出完毕后换行 20 cout << endl; 21 } 22 return 0; 23}
代码解释:
i == j 判断主对角线(左上到右下)。i + j == n - 1 判断副对角线(右上到左下)。cout 逐个字符输出,不添加多余空格。endl 进行换行。本题中 N 最大仅为 49,N² = 2401,运算量极小,完全可以在一瞬间完成。
endl,符合要求)。for 循环依次判断输出,也可以预先构建字符串再输出,但直接输出更为高效简洁。以上就是本题的完整题解,希望能帮助大家理解并 AC 此题。