极简奇数阶幻方生成算法:10行代码三步生成奇数阶幻方

极简奇数阶幻方生成算法:10行代码三步生成奇数阶幻方

问题:
幻方是一种古老的中国传统游戏,要求在n乘n的棋盘中填入从1开始的若干个自然数,若n为奇数则要求棋盘上的每一行,列,对角线和相等(这里只讨论n为奇数的情况)
ps:本人(萌新瑟瑟发抖抱头蹲防.jpg)大一,第一次发帖 请dalao手下留情
例1:三阶幻方
6 1 8
7 5 3
2 9 4
例2:五阶幻方
14 10 1 22 18
20 11 7 3 24
21 17 13 9 5
2 23 19 15 6
8 4 25 16 12
————————————————————
下面介绍本人原创的奇数阶幻方生成公式:
step1.
给定幻方阶数n,并生成如下一组有规律的对称矩阵(这里以n=3为例)
3阶
2 0 1 # 1 0 2
0 1 2 # 2 1 0
1 2 0 # 0 2 1
5阶
3 4 0 1 2 # 2 1 0 4 3
4 0 1 2 3 # 3 2 1 0 4
0 1 2 3 4 # 4 3 2 1 0
1 2 3 4 0 # 0 4 3 2 1
2 3 4 0 1 # 1 0 4 3 2
很容易就能找出其中规律:矩阵最中间的行就是一个从0至n-1递增的数列,往后的每一行的每个元素都相当于上一行对应元素+1后%n
step2.将左侧矩阵所有元素+1,右侧矩阵所有元素*n(3)
3 1 2 # 3 0 6
1 2 3 # 6 3 0
2 3 1 # 0 6 3
step3.两个矩阵相加,幻方构造完成
6 1 8
7 5 3
2 9 4 (没错就是这么简单)
经验证该矩阵行,列,对角线的和均一致且等于15,符合幻方的要求
————————————————————
废话不多上C代码:

int n,i,j,t;
scanf("%d",&n);//输入阶数
for(i=0; i<n; i++)//行
{
    t=(i+n-n/2)%n;//行偏移量(确定中间行)
    for(j=0; j<n; j++)//列
        printf("%d\t",(t+n-j-1)%n*n+(t+j)%n+1);
    printf("\n");
}

测试:

//输入1:
1
//输入5:
14      10      1       22      18
20      11      7       3       24
21      17      13      9       5
2       23      19      15      6
8       4       25      16      12
//输入7:(因为一行放不下那么多数所以调整了输出格式)
26-20-14-1-44-38-32
34-28-15-9-3-46-40
42-29-23-17-11-5-48
43-37-31-25-19-13-7
2-45-39-33-27-21-8
10-4-47-41-35-22-16
18-12-6-49-36-30-24
//输入3:
6       1       8
7       5       3
2       9       4
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值