题目描述
给定一个自然数 N(2≤N≤9),要求生成一个边长为 N 的旋转矩阵。矩阵元素从 1 到 N*N,按顺时针方向从左上角开始填充。
例如 N=3 时,矩阵呈螺旋状排列:
1 2 3
8 9 4
7 6 5
输入为一个整数 N,输出为对应的方阵,每个数字占 5 个字符宽度,右对齐。
核心思路
这个问题本质上是模拟螺旋遍历的过程。我们可以把矩阵看作一层一层的'洋葱',从外向内逐层填充。
定义变量 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++)
array[n - m - 1][n - i - 1] = 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]);
();
}
;
}


