在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。我国古代称为“河图”、“洛书”,又叫“纵横图”。下图便是著名的“洛书”——在数学上叫“三阶幻方”:
对于三阶幻方,金庸在《射雕英雄传》里有一段精彩的描述,其中有段口诀朗朗上口——“二四为肩,六八为足,左七右三,足九履一,五居其中”。
在幻方中,一共有三种类型:奇数阶幻方(n=2k+1),单偶数阶幻方(n=2(2k+1)),双偶数阶幻方(n=4k)。其中尤以奇数阶幻方最为简单,单偶数阶最为复杂。奇数阶幻方有多种构造方法,其中最著名的要数“阶梯法”了。
阶梯法方法如下:
- 1位于第一行中间;
- 每一个数放在前一个数的右上一格;
- 如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
- 如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
- 如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
- 如果这个数所要放的格已经有数填入,处理方法同4.
经过以上六步构造,一个高阶奇数幻方就出来了。
利用python构造一个奇数幻方的代码如下:
#!/usr/bin/env python3
#奇阶幻方构造——阶梯法
n=int(input("请输入一个奇数(n<=19):"))
Magic=[([0]*n)for i in range(n)]
i=0
j=(n-1)//2
Magic[i][j]=1
for m in range(2,n*n+1,1):
i0=i
j0=j
i=(i+n-1)%n
j=(j+n+1)%n
if Magic[i][j]!=0:
i=(i0+n+1)%n
j=j0
if i0==0 and j0==n-1:
i=1
j=n-1
Magic[i][j]=m
for i in range(n):
for j in range(n):
print("%3d"%Magic[i][j],end=' ')
print()
input("Press
这玩意有点麻烦啊。
第一次来访留个记号
你这comment的边上,老闪个`留言无头’
很多人无头的,提醒一下嘛。。。
其实不止这一种方法。(废话。)阶梯怎么摆,都可以试一试。