编写c程序:.检验并打印魔方矩阵 定义一个 5×5 的二维整型数组(初始化值为如下矩阵),检验其是否为魔方

编写c程序:.检验并打印魔方矩阵 定义一个 5×5 的二维整型数组(初始化值为如下矩阵),检验其是否为魔方,第1张

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#define N 5

void main()

{

int i,j

int x[N][N]={{17,24,1,8,15},{23,5,7,14,16},

{4,6,13,20,22},{10,12,19,21,3},{11,18,25,2,9}}

int rowsum[N],colsum[N],diagsum1,diagsum2

int flag=1

for(i=0i<Ni++)

{

rowsum[i]=0

for(j=0j<Nj++)

{

rowsum[i]=rowsum[i]+x[i][j]

}

}

for(j=0j<Nj++)

{

colsum[j]=0

for(i=0i<Ni++)

{

colsum[j]=colsum[j]+x[i][j]

}

}

diagsum1=0

for(j=0j<Nj++)

{

diagsum1=diagsum1=x[j][j]

}

diagsum2=0

for(j=0j<Nj++)

{

diagsum2=diagsum2=x[j][N-1-j]

}

if(diagsum1!=diagsum2)

{

flag=0

}

else

{

for(i=0i<Ni++)

{

if((rowsum[i]!=diagsum1)||(colsum[i]!=diagsum1))

flag=0

}

}

if(flag)

{

printf("It is magic square!\n")

for(i=0i<Ni++)

{

for(j=0j<Nj++)

{

printf("%4d",x[i][j])

}

printf("\n")

}

}

else

{

printf("It is not magic square!\n")

}

}

看一下

#include <stdio.h>

main()

{ int a[16][16],i,i,k,p,m,n

p=1

while(p==1) /*要求阶数为1~15的商数*/

{ printf("Enter n(n=1~15):")

scanf("%d",&n)

if((n!=0)&&(n<=15)&&(n%2!=0)) p=0

}

for(i=1i<=ni++) /*初始化*/

for(j=1j<=nj++) a[i][j]=0

j=n/2+1/*建立魔方阵*/

a[1][j]=1

for(k=2k<=n*nk++)

{ i=i-1

j=j+1

if((i<1)&&(j>n))

{ i=i+2

j=j-1

}

else

{ if(i<1) i=n

if(j>n) j=1

}

if(a[i][j]==0) a[i][j]=k

else

{ i=i+2

j=j-1

a[i][j]=k

}

}

for(i=1i<=ni++) /*输出魔方阵*/

{ for(j=1j<=nj++)

printf("%4d",a[i][j])

printf("\n")

}

}

下面的够详细了吧

奇阶幻方

当n为奇数时,我们称幻方为奇阶幻方。可以用Merzirac法与loubere法实现,根据我的研究,发现用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法。

偶阶幻方

当n为偶数时,我们称幻方为偶阶幻方。当n可以被4整除时,我们称该偶阶幻方为双偶幻方;当n不可被4整除时,我们称该偶阶幻方为单偶幻方。可用了Hire法、 Strachey以及YinMagic将其实现,Strachey为单偶模型,我对双偶(4m阶)进行了重新修改,制作了另一个可行的数学模型,称之为 Spring。YinMagic是我于2002年设计的模型,他可以生成任意的偶阶幻方。

在填幻方前我们做如下约定:如填定数字超出幻方格范围,则把幻方看成是可以无限伸展的图形,如下图:

Merzirac法生成奇阶幻方

在第一行居中的方格内放1,依次向左上方填入2、3、4…,如果左上方已有数字,则向下移一格继续填写。如下图用Merziral法生成的5阶幻方:

17 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

loubere法生成奇阶幻方

在居中的方格向上一格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向上移二格继续填写。如下图用Louberel法生成的7阶幻方:

30 39 48 1 10 19 28

38 47 7 9 18 27 29

46 6 8 17 26 35 37

5 14 16 25 34 36 45

13 15 24 33 42 44 4

21 23 32 41 43 3 12

22 31 40 49 2 11 20

horse法生成奇阶幻方

先在任意一格内放入1。向左走1步,并下走2步放入2(称为马步),向左走1步,并下走2步放入3,依次类推放到n。在n的下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下边放入2n+1。如下图用Horse法生成的5阶幻方:

77 58 39 20 1 72 53 34 15

6 68 49 30 11 73 63 44 25

16 78 59 40 21 2 64 54 35

26 7 69 50 31 12 74 55 45

36 17 79 60 41 22 3 65 46

37 27 8 70 51 32 13 75 56

47 28 18 80 61 42 23 4 66

57 38 19 9 71 52 33 14 76

67 48 29 10 81 62 43 24 5

一般的,令矩阵[1,1]为向右走一步,向上走一步,[-1,0]为向左走一步。则马步可以表示为2X+Y,{X∈{[1,0], [-1,0]},Y∈{[0,1], [0,-1]}}∪{Y∈{[1,0], [-1,0]},X∈{[0,1], [0,-1]}}。对于2X+Y相应的跳步可以为2Y,-Y,X,-Y,X,3X,3X+3Y。上面的的是X型跳步。Horse法生成的幻方为魔鬼幻方。

Hire法生成偶阶幻方

将n阶幻方看作一个矩阵,记为A,其中的第i行j列方格内的数字记为a(i,j)。在A内两对角线上填写1、2、3、……、n,各行再填写1、2、3、……、n,使各行各列数字之和为n*(n+1)/2。填写方法为:第1行从n到1填写,从第2行到第n/2行按从1到进行填写(第2行第1列填n,第2行第n列填1),从第n/2+1到第n行按n到1进行填写,对角线的方格内数字不变。如下所示为6 阶填写方法:

1 5 4 3 2 6

6 2 3 4 5 1

1 2 3 4 5 6

6 5 3 4 2 1

6 2 4 3 5 1

1 5 4 3 2 6

如下所示为8阶填写方法(转置以后):

1 8 1 1 8 8 8 1

7 2 2 2 7 7 2 7

6 3 3 3 6 3 6 6

5 4 4 4 4 5 5 5

4 5 5 5 5 4 4 4

3 6 6 6 3 6 3 3

2 7 7 7 2 2 7 2

8 1 8 8 1 1 1 8

将A上所有数字分别按如下算法计算,得到B,其中b(i,j)=n×(a(i,j)-1)。则AT+B为目标幻方

(AT为A的转置矩阵)。如下图用Hire法生成的8阶幻方:

1 63 6 5 60 59 58 8

56 10 11 12 53 54 15 49

41 18 19 20 45 22 47 48

33 26 27 28 29 38 39 40

32 39 38 36 37 27 26 25

24 47 43 45 20 46 18 17

16 50 54 53 12 11 55 9

57 7 62 61 4 3 2 64

Strachey法生成单偶幻方

将n阶单偶幻方表示为4m+2阶幻方。将其等分为四分,成为如下图所示A、B、C、D四个2m+1阶奇数幻方。

A C

D B

A用1至2m+1填写成(2m+1)2阶幻方;B用(2m+1)2+1至2*(2m+1)2填写成2m+1阶幻方;C用2*(2m+1)2+1至3*(2m+1)2填写成2m+1阶幻方;D用3*(2m+1)2+1至4*(2m+1)2填写成 2m+1阶幻方;在A中间一行取m个小格,其中1格为该行居中1小格,另外m-1个小格任意,其他行左侧边缘取m列,将其与D相应方格内交换;B与C接近右侧m-1列相互交换。如下图用Strachey法生成的6阶幻方:

35 1 6 26 19 24

3 32 7 21 23 25

31 9 2 22 27 20

8 28 33 17 10 15

30 5 34 12 14 16

4 36 29 13 18 11

Spring法生成以偶幻方

将n阶双偶幻方表示为4m阶幻方。将n阶幻方看作一个矩阵,记为A,其中的第i行j列方格内的数字记为a(i,j)。

先令a(i,j)=(i-1)*n+j,即第一行从左到可分别填写1、2、3、……、n;即第二行从左到可分别填写n+1、n+2、n+3、……、2n;…………之后进行对角交换。对角交换有两种方法:

方法一;将左上区域i+j为偶数的与幻方内以中心点为对称点的右下角对角数字进行交换;将右上区域i+j为奇数的与幻方内以中心点为对称点的左下角对角数字进行交换。(保证不同时为奇或偶即可。)

方法二;将幻方等分成m*m个4阶幻方,将各4阶幻方中对角线上的方格内数字与n阶幻方内以中心点为对称点的对角数字进行交换。

如下图用Spring法生成的4阶幻方:

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

YinMagic构造偶阶幻方

先构造n-2幻方,之后将其中的数字全部加上2n-2,放于n阶幻方中间,再用本方法将边缘数字填写完毕。本方法适用于n>4的所有幻方,我于2002年12月31日构造的数学模型。YinMagic法可生成6阶以上的偶幻方。如下图用 YinMagic法生成的6阶幻方:

10 1 34 33 5 28

29 23 22 11 18 8

30 12 17 24 21 7

2 26 19 14 15 35

31 13 16 25 20 6

9 36 3 4 32 27

魔鬼幻方

如将幻方看成是无限伸展的图形,则任何一个相邻的n*n方格内的数字都可以组成一个幻方。则称该幻方为魔鬼幻方。

用我研究的Horse法构造的幻方是魔鬼幻方。如下的幻方更是魔鬼幻方,因为对于任意四个在两行两列上的数字,他们的和都是34。此幻方可用YinMagic方法生成。

15 10 3 6

4 5 16 9

14 11 2 7

1 8 13 12

罗伯法:

1居上行正中央,依次排开右上方。

右出格时写最左,上出格时写最下.

每逢几个落一行.(几个是几*几的方阵中的几)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12160227.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存