1267: 【入门】鲜花方阵
题目描述
光明小学艺术节快要来了,老师要求同学们布置一个n * n的花盆方阵(n是奇数,n<=9);
如果n=5,那么方阵的形状如下图所示;
如果n=7,那么方阵的形状如下图所示;
请读入一个整数n(奇数),输出如图所示的方阵,为了方便输出,用1表示黄色的花盆,0表示红色花盆,输出时数字场宽设置为3。
例如:n=5,那么实际要输出的方阵的结果如下
n=7,那么实际要输出的方阵的结果如下
输入
一个整数n
输出
如图所示的图形
样例输入
5
样例输出
1 1 0 1 11 0 1 0 10 1 0 1 01 0 1 0 11 1 0 1 1
代码实现及解析
#include <bits/stdc++.h>
using namespace std;int main() {int n, i, j;cin >> n;int a[n][n];for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {a[i][j] = 1;if (i == n / 2 && j == n / 2) {a[i][j] = 0;}if (i + j == n / 2 || i - j == n / 2 || j - i == n / 2 || i + j == (n / 2 - 1 + n)) {a[i][j] = 0;}printf("%3d", a[i][j]);}cout << endl;}return 0;
}
深度解析代码
这段C++代码生成并打印一个特定模式的n×n矩阵。让我们逐步分析它的工作原理和实现思路。
代码结构解析
矩阵填充逻辑
代码通过双重循环填充矩阵:
for (i = 0; i < n; i++) {for (j = 0; j < n; j++) {a[i][j] = 1; // 默认所有元素为1// 特殊位置设置为0if (i == n / 2 && j == n / 2) {a[i][j] = 0;}if (i + j == n / 2 || i - j == n / 2 || j - i == n / 2 || i + j == (n / 2 - 1 + n)) {a[i][j] = 0;}printf("%3d", a[i][j]); // 格式化输出}cout << endl;
}
模式生成原理
-
默认值:所有元素初始化为1。
-
中心点:当
i == n/2 && j == n/2
时设为0,这是矩阵的正中心(当n为奇数时)。 -
四条对角线:
-
i + j == n / 2
:主对角线方向的反斜线 -
i - j == n / 2
:副对角线方向的正斜线 -
j - i == n / 2
:副对角线方向的正斜线(另一侧) -
i + j == (n / 2 - 1 + n)
:主对角线方向的反斜线(另一侧)
-
这些条件共同在矩阵中形成一个"X"形状的图案,中心点被清零。
示例分析
以n=5为例:
-
n/2 = 2
-
四条对角线条件:
-
i+j=2
-
i-j=2
-
j-i=2
-
i+j=2-1+5=6
-
生成的矩阵:
1 0 1 0 1
0 1 1 1 0
1 1 0 1 1
0 1 1 1 0
1 0 1 0 1
可以看到:
-
中心点(2,2)为0
-
四条对角线上的元素为0,形成X形状
代码特点
-
格式化输出:使用
printf("%3d")
确保每个数字占3个字符宽度,保持对齐。 -
边界处理:对于偶数n,中心点可能不完全对称,但逻辑仍然适用。
-
数学关系:通过简单的数学关系(i±j)来定义图案,而非硬编码。