魔方阵算法及C语言实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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// Author: / 3// N为魔方阶数 4#define N 115 6int main()7{8int a[N][N]; 9int i;10 int col,row;111

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// Author: / 3// N为魔方阶数, 4#define N 1

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// Author: / 3// N为魔方阶数 4#define N 1

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……)的魔方(单偶魔方)

算法

相关文档
最新文档