构造奇数阶幻方
程序员文章站
2024-03-19 10:12:52
...
构造奇数阶幻方
什么是幻方
一个n*n的正方形矩阵
每一行/列以及对角线上各数之和相同
如何构造奇数阶幻方
1.第一个数
1
要放在第一行的中间
2.下一个数按走楼梯的方式向上
3.超过行数/列数则循环摆放(类似于循环左右移的操作), 如下例 :
(这里
2
从上面超出了行,循环放到最下面去)
4.如果下一次填的位置已经被填过了,就放到上一次填的数的下方
(填了
5
过后,6
本该填到1
的位置,但是既然已经填过了,所以就填到5
的下方去)
5.继续循环走楼梯
实例
当n=5时, 应当构建的幻方结果如下:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
C语言实现
#include <stdio.h>
#include <stdlib.h>
main()
{
int n=5;
//也可以改为手动输入
//printf("输入一个奇数:\n");
//scanf("%d",&n);
int sqrtn=n*n;
int i,j,k;
//为二维矩阵分配内存
int** matrix=(int**) calloc(n,sizeof(int*));//分配一维矩阵内存
for (i=0;i<n;i++) {
matrix[i] = (int*) calloc(n,sizeof(int));//分配二维矩阵内存
}
//从第一行正中间开始填
i=0;
j=n/2;
for(k=1;k<=sqrtn;k++) {
matrix[i][j]=k;
//走阶梯,这里超出行或列可以用模运算来做
i=(i+n-1)%n;//这里加n是为了防止i=0时,i-1为负数
j=(j+1)%n;
//下一个要填的位置已经被填过了,处理一下
if(matrix[i][j]>0) {
i=(i+2)%n;//行调整为上一次填的数下方,刚刚上移了一行,这里就要下移2行
j=(j+n-1)%n;//把刚才加的1列还原(就是不加)
}
}
//打印二维数组
for(i=0;i<n;i++) {
for(j=0;j<n;j++)
printf("%d\t",matrix[i][j]);
printf("\n");
}
//数组使用完毕后记得释放内存空间以避免内存泄漏
for (i=0;i<n;i++) {
free(matrix[i]);
}
free(matrix);
}
PS:其实明白了思路很简单…
之前看到其他博主大量代码真头疼…自己写了一遍才发现并不难…