魔方阵算法及C语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
魔方阵算法及C语言实现
1 魔方阵概念
魔方阵是指由1,2,3……n2填充的,每一行、每一列、对角线之和均相等的方阵,阶数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
2 col = (N-1)/2;1
3 row = 0;1415
a[row][col] = 1;1617for(i = 2; i <= N*N; i++)18 {19
if((i-1)%N == 0 )20 {21 row++;22 }23
else24 {25// if row = 0, then row = N-1, or row = row - 126 row--;27 row = (row+N)%N;2829
// if col = N, then col = 0, or col = col + 130 col ++;31 col %= N;32 }33 a[row][col] = i;34 }35for(row = 0;row {39 printf("%6d",a[row][col]);40 }41 printf("\n");42 }43return0;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,3……n2顺序对魔方阵从左到右,从上到下进行填充; 2.将魔方中间n/2列的元素上、下进行翻转; 3.将魔方中间n/2行的元素左、右进行翻转。 C语言实现 1 #include 2 5 6int main() 7{ 8int a[N][N];//存储魔方 9 int i, temp;//临时变量10int col, row;//col 列,row 行1112//初始化1 3 i = 1;14for(row = 0;row < N; row++)15 {16 for(col = 0;col < N; col ++)17 {18 a[row][col] =i;19 i++;20 }21 }2223//翻转中间列24for(row = 0; row < N/2; row ++)25 {26for(col = 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 }3334//翻转中间行35for(col = 0; col < N/2; col ++)36 {37for(row = 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 }4445for(row = 0;row < N; row++)46 {47for(col = 0;col < N; col ++)48 {49 printf("%5d",a[row][col]);50 }51 printf("\n");52 }53return0;54 } 算法2:阶数n = 4 * m(m =1,2,3……)的偶魔方的规律如下: 1.按数字从小到大,即1,2,3……n2顺序对魔方阵从左到右,从上到下进行填充; 2.将魔方阵分成若干个4×4子方阵,将子方阵对角线上的元素取出; 3.将取出的元素按从大到小的顺序依次填充到n×n方阵的空缺处。 C语言实现 1 #include 2 5 6int main() 7{ 8int a[N][N];//存储魔方 9 int temparray[N*N/2];//存储取出的元素10int i;//循环变量11 int col, row;// col 列,row 行1213//初始化14 i = 1;15 for(row = 0;row < N; row++)16 {17for(col = 0;col < N; col ++)18 {19 a[row][col] = i;20 i++;21 }22 }23//取出子方阵中对角线上的元素,且恰好按从小到大的顺序排放24 i = 0;25for(row = 0;row < N; row++)26 {27for(col = 0;col < N; col ++)28 {29 if((col % 4== row % 4) || ( 3== ( col % 4+ row % 4)))30 {31 temparray[i] = a[row][col];32 i++;33 }34 }35 }36//将取出的元素按照从大到小的顺序填充到n×n方阵中37 i = N*N/2 -1;38for(row = 0;row < N; row++)39 {40for(col = 0;col < N; col ++)41 {42 if((col % 4== row % 4) || ( 3== ( col % 4+ row % 4)))43 {44 a[row][col] = temparray[i];45 i--;46 }47 }48 }49//输出方阵50 for(row = 0;row < N; row++)51 {52for(col = 0;col < N; col ++)53 {54 printf("%5d",a[row][col]);55 }56 printf("\n");57 }58return0;59 } 3.2 阶数n = 4 * m + 2(m =1,2,3……)的魔方(单偶魔方) 算法