问题描述
给定一个自然数 $N$($2 \le N \le 9$),要求生成一个边长为 $N$ 的方阵。方阵中的元素从 1 到 $N \times N$,起始位置在左上角,按照顺时针方向依次填充。
例如当 $N=3$ 时,输出如下:
1 2 3
8 9 4
7 6 5
输入输出规范
- 输入:一个整数 $N$。
- 输出:对应的方阵,每个数字占 5 个字符宽度并右对齐。
解题思路
这道题的核心在于模拟'螺旋'填充的过程。我们可以把矩阵看作一层一层的洋葱皮,从最外层开始向内填充。
定义一个二维数组 array[SIZE][SIZE] 来存储数据。使用变量 m 表示当前正在填充的层数,初始为 0。对于每一层,我们需要按顺序完成四个动作:
- 从左向右填充上边;
- 从上向下填充右边;
- 从右向左填充下边;
- 从下向上填充左边。
注意边界条件,当 $N$ 为奇数时,最后会剩下中心的一个格子需要单独处理,因为偶数层循环刚好能覆盖所有元素。
代码实现
下面是完整的 C 语言实现,包含了详细的注释帮助理解循环逻辑。
#include <stdio.h>
#define SIZE 9
int main() {
int array[SIZE][SIZE];
int n, m, num, i, j;
num = 1;
scanf("%d", &n);
// 按层填充,每层是一个矩形环
for (m = 0; m < n / 2; m++) {
// 上边:从左到右
for (i = m; i < n - m - 1; i++) {
array[m][i] = num++;
}
// 右边:从上到下
for (i = m; i < n - m - 1; i++) {
array[i][n - m - 1] = num++;
}
// 下边:从右到左
for (i = m; i < n - m - 1; i++) {
[n - m - ][n - i - ] = num++;
}
(i = m; i < n - m - ; i++) {
[n - i - ][m] = num++;
}
}
(n % ) {
[n / ][n / ] = num;
}
(i = ; i < n; i++) {
(j = ; j < n; j++) {
(, [i][j]);
}
();
}
;
}


