#include <stdio.h>
int main() {
int n;
do{
scanf("%d", &n);
} while (n % 2 == 0);
int a[n][n], num = 0, i, j, posi, posj;
// 初始化
for (i = 0; i < n; ++i) {
for (j = 0; j < n; ++j) {
a[i][j] = 0;
}
}
// 第一步:把1放在第一行中间
a[0][n/2] = 1;
i = 0;
j = n / 2;
for (num = 2; num <= n*n; ++num) {
// 行减一,列加一
posi = i;
posj = j;//存储原来位置
i--;
j++;
// 考虑边界情况
if(i == -1) {
i = n - 1;
}
if(i == n) {
i = 0;
}
if(j == -1) {
j = n - 1;
}
if(j == n) {
j = 0;
}
// 如果这个位置有数,则把位置放在原来的下面一位
if(a[i][j] != 0) {
i = posi + 1;
j = posj;
}
a[i][j] = num;
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%6d", a[i][j]);
}
putchar('\n');
}
return 0;
}
运行结果
n=3
n=5(魔法阵必须为奇数)