魔方阵
魔方阵也叫幻方、纵横图,是指组成元素为自然数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 }
双偶数阶魔方
双偶数阶魔方