魔方阵算法及C语言实现
下载后可任意编辑 魔方阵算法及C语言实现 1 魔方阵概念 魔方阵是指由1,2,3n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数n 3,4,5。魔方阵也称为幻方阵。 例如三阶魔方阵为 魔方阵有什么的规律呢 魔方阵分为奇幻方和偶幻方。而偶幻方又分为是4的倍数(如4,8,12)和不是4的倍数(如6,10,14)两种。下面分别进行介绍。 2 奇魔方的算法 2.1 奇魔方的规律与算法 奇魔方(阶数n 2 * m 1,m 1,2,3)规律如下 1. 数字1位于方阵中的第一行中间一列; 2. 数字a(1 a ≤ n2)所在行数比a-1行数少1,若a-1的行数为1,则a的行数为n; 3. 数字a(1 a ≤ n2)所在列数比a-1列数大1,若a-1的列数为n,则a的列数为1; 4. 假如a-1是n的倍数,则a(1 a ≤ n2)的行数比a-1行数大1,列数与a-1相同。 2.2 奇魔方算法的C语言实现 1 include stdio.h 2 // Author http// 3 // N为魔方阶数 4 define N 11 5 6 int main 7 { 8 int a[N][N]; 9 int i;10 int col,row;11 12 col N-1/2;13 row 0;14 15 a[row][col] 1;16 17 fori 2; i N*N; i18 {19 ifi-1N 0 20 {21 row;22 }23 else24 {25 // if row 0, then row N-1, or row row - 126 row--;27 row rowNN;28 29 // if col N, then col 0, or col col 130 col ;31 col N;32 }33 a[row][col] i;34 }35 forrow 0;rowN;row36 {37 forcol 0;col N; col 38 {39 printf6d,a[row][col];40 }41 printf\n;42 }43 return 0;44 } 3 偶魔方的算法 偶魔方的情况比较特别,分为阶数n 4 * m(m 1,2,3)的情况和阶数n 4 * m 2(m 1,2,3)情况两种。 3.1 阶数n 4 * m(m 1,2,3)的魔方(双偶魔方) 算法1阶数n 4 * m(m 1,2,3)的偶魔方的规律如下 1. 按数字从小到大,即1,2,3n2顺序对魔方阵从左到右,从上到下进行填充; 2. 将魔方中间n/2列的元素上、下进行翻转; 3. 将魔方中间n/2行的元素左、右进行翻转。 C语言实现 1 include stdio.h 2 // Author http// 3 // N为魔方阶数, 4 define N 12 5 6 int main 7 { 8 int a[N][N];//存储魔方 9 int i, temp;//临时变量10 int col, row;//col 列,row 行11 12 //初始化13 i 1;14 forrow 0;row N; row15 {16 forcol 0;col N; col 17 {18 a[row][col] i;19 i;20 }21 }22 23 //翻转中间列24 forrow 0; row N/2; row 25 {26 forcol N/4;col N/4*3;col 27 {28 temp a[row][col];29 a[row][col] a[N-row-1][col];30 a[N-row-1][col] temp;31 }32 }33 34 //翻转中间行35 forcol 0; col N/2; col 36 {37 forrow N/4;row N/4 * 3;row 38 {39 temp a[row][col];40 a[row][col] a[row][N-col-1];41 a[row][N-col-1] temp;42 }43 }44 45 forrow 0;row N; row46 {47 forcol 0;col N; col 48 {49 printf5d,a[row][col];50 }51 printf\n;52 }53 return 0;54 } 算法2阶数n 4 * m(m 1,2,3)的偶魔方的规律如下 1. 按数字从小到大,即1,2,3n2顺序对魔方阵从左到右,从上到下进行填充; 2. 将魔方阵分成若干个44子方阵,将子方阵对角线上的元素取出; 3. 将取出的元素按从大到小的顺序依次填充到nn方阵的空缺处。 C语言实现 1 include stdio.h 2 // Author http// 3 // N为魔方阶数 4 define N 12 5 6 int main 7 { 8 int a[N][N];//存储魔方 9 int temparray[N*N/2];//存储取出的元素10 int i;//循环变量11 int col, ro