(纯c语言运行通过)任意阶魔阵算法及规律

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

任意阶魔方阵算法

20012-05-30 22:51:00| 分类:魔阶作者:王狼杰

我一直就对魔方阵很感兴趣,特别是知道了奇数阶魔方阵的罗伯特算法后,就特别想知道偶数阶魔方阵应有什么算法。当时书上说偶数阶魔方阵比较复杂。都没有什么说明。因此这个问题一直搁在我心里很久,已差不多快忘记了。今天突然又想到了这个问题。于是我开始在网上搜寻,看能不能找到什么好的算法。记得在高中的时候,我就做过魔方阵,当时我从三阶一直做到过八阶方阵,不过用的是人工的方法。到大学的时候我知道了罗伯特算法后,我就用程序将算法写了出来。于是我今天准备把偶数阶的魔方阵也写出来。在网上终于找到了一个比较好的算法。将该算法用C写了出来。供大家分亨。

1、奇数阶幻方

n为奇数(n=3,5,7,9,11……) (n=2*k+1,k=1,2,3,4,5……)

奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯方)。填写方法是这样:

把1(或最小的数)放在第一行正中;按以下规律排列剩下的n*n-1个数:

(1)、每一个数放在前一个数的右上一格;

(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;

(3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;

(4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;

(5)、如果这个数所要放的格已经有数填入,处理方法同(4)。

这种写法总是先向“右上”的方向,象是在爬楼梯。

2、双偶阶幻方

n为偶数,且能被4整除(n=4,8,12,16,20……) (n=4k,k=1,2,3,4,5……)

先说明一个定义:

互补:如果两个数字的和,等于幻方最大数和最小数的和,即n*n+1,称为互补。

先看看4阶幻方的填法:将数字从左到右、从上到下按顺序填写:

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

这个方阵的对角线,已经用蓝色标出。将对角线上的数字,换成与它互补的数字。

这里,n*n+1 = 4*4+1 = 17;

把1换成17-1 = 16;把6换成17-6 = 11;把11换成17-11 = 6……换完后就是一个四阶幻方。

16 2 3 13

5 11 10 8

9 7 6 12

4 14 1

5 1

对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按4*4把它划分成k*k个方阵。因为n是4的倍数,一定能用4*4的小方阵分割。然后把每个小方阵的对角线,象制作4阶幻方的方法一样,对角线上的数字换成互补的数字,就构成幻方。下面是8阶幻方的作法:(1) 先把数字按顺序填。然后,按4*4把它分割成2*2个小方阵

1 2 3 4 5 6 7 8

9 10 11 12 13 14 15 16

17 18 19 20 21 22 23 24

25 26 27 28 29 30 31 32

33 34 35 36 37 38 39 40

41 42 43 44 45 46 47 48

49 50 51 52 53 54 55 56

57 58 59 60 61 62 63 64

(2) 每个小方阵对角线上的数字,换成和它互补的数。

64 2 3 6160 6 7 57

9 5554 1213 5150 16

17 47 46 20 21 4342 24

40 26 27 37 36 30 31 33

32 34 35 2928 38 39 25

41 2322 44 45 1918 48

49 15 14 5253 1110 56

8 58 59 54 62 63 1

3、单偶阶幻方

n为偶数,且不能被4整除(n=6,10,14,18,22……) (n=4k+2,k=1,2,3,4,5……) 这是三种里面最复杂的幻方。

以n=10为例。这时,k=2

(1) 把方阵分为A,B,C,D四个象限,这样每一个象限肯定是奇数阶。用楼梯法,依次在A象限,D象限,B象限,C象限按奇数阶幻方的填法填数。

A B

C D

17 24 1 8 15 67 74 51 58 65

23 5 7 14 16 73 55 57 64 66

4 6 13 20 22 54 56 63 70 72

10 12 19 21 360 62 69 71 53

11 18 25 2 9 61 68 75 52 59

92 99 76 83 9042 49 26 33 40

98 80 82 89 9148 30 32 39 41

79 81 88 95 97 29 31 38 45 47

85 87 94 96 7835 37 44 46 28

86 93 100 77 84 36 43 50 27 34

(2) 在A象限的中间行、中间格开始,按自左向右的方向,标出k格。A象限的其它行则标出最左边的k格。

>>>

17 24 1 8 15 67 74 51 58 65

23 5 7 14 16 73 55 57 64 66

10 12 19 21 3 60 62 69 71 53

11 18 25 2 9 61 68 75 52 59

92 99 76 83 90 42 49 26 33 40

98 80 82 89 91 48 30 32 39 41

79 81 88 95 97 29 31 38 45 47

85 87 94 96 78 35 37 44 46 28

86 93 100 77 84 36 43 50 27 34

(3) 将这些格,和C象限相对位置上的数,互换位置。

92 99 1 8 1567 74 51 58 65

98 80 7 14 16 73 55 57 64 66

4 6 88 9

5 2254 5

6 63 70 72

85 87 19 21 360 62 69 71 53

86 93 25 2 9 61 68 75 52 59

17 24 76839042 49 26 33 40

23 5 82899148 30 32 39 41

7981 13 20 97 29 31 38 45 47

10 12 94 96 78 35 37 44 46 28

11 18 100 77 8436 43 50 27 34

(4) 在B象限任一行的中间格,自右向左,标出k-1列。(注:6阶幻方由于k-1=0所以不用再作B、D象限的数据交换)

<<<

92 99 1 8 15 67 74 51 58 65

98 80 7 14 16 73 55 57 64 66

4 6 88 9

5 22 54 5

6 63 70 72

相关文档
最新文档