魔方阵

魔方阵也叫幻方纵横图是指组成元素为自然数1、2、…、n2的平方的n×n方阵,1~n中的每个数都会出现在元素中,且不重复出现,且每行每列以及主、副对角线上各n个元素之和都相等。

根据魔方阵的阶数,魔方阵分为,奇数阶魔方阵双偶数阶魔方阵单偶数阶魔方阵。(奇数阶指的是从3开始的奇数,双偶数指的是能被4整除的偶数,单偶数指的是从2开始的偶数能被2整除而不能被4整除的数;用公式来表示就是2k+1,k=1,3,...;4k,k=1,2...;2k,k=1,3...;)

 

奇数阶魔方阵

奇数阶魔方阵只有一个

 

规律

1. 第一行的中间位置为1。

2. 数字a所在的位置为a-1的位置上移,右移。

3. 当a-1在第一行时,a在最后一行;当a-1在最后一列时,a在第一列。

4.若a-1的元素值为n的倍数,则a所在的位置为a-1的位置下移。

 

填充思路

1. 令第一行中间的元素为1。

2. 沿着副对角线填充元素。

3. 若行数超出二维数组范围,初始化行到最后一行。

4. 若列数超出二维数组范围,初始化列到第一列。

6.若要填充的位置已有值,行数加一,列数不变。

 

c语言实现

实现奇数阶魔方阵的算法有很多,这里仅仅是其中一种。算法核心有轮回结构,以及判断下一个位置是否有数值。本算法用的是当型轮回结构;巧妙地运用了当m为阶数的倍数时,下一个位置肯定已经填充过数值的的规律,来判断下一个位置是否有数值。

 0 //m代表1~n2的自然数 n为阶数 i为行数 j为列数
1
for(int m=1;m<=n*n;)                           //从1开始遍历 2 { 3 if(m>=n&&m%n==0)                        //若m为阶数的倍数 4 { 5 if(i>=0&&i<n&&j>=0&&j<n) {a[i][j]=m;i++;m++;}    //若行列均正常 6 else 7 { 8 if(i==-1) i=n-1;                   //若行溢出了
9 if(j==n) j=0;                     //若列溢出了 10 } 11 } 12 if(m<n||m%n!=0)                         //若m不是阶数的倍数 13 { 14 if(i>=0&&i<n&&j>=0&&j<n) {a[i][j]=m;i--;j++;m++;}   //若行列均正常 15 else 16 { 17 if(i==-1) i=n-1;                    //若行溢出了 18 if(j==n) j=0;                      //若列溢出了 19 } 20 } 21 22 }

 

双偶数阶魔方

双偶数阶魔方

posted @ 2019-03-17 21:54  jawide  阅读(2203)  评论(0编辑  收藏  举报