幻方构造(一) | 寒山烟雨
现在的位置: 首页 > 小试身手 > 正文

幻方构造(一)

2012年04月22日 小试身手 ⁄ 共 563字 ⁄ 字号 评论 5 条 ⁄ 阅读 6,755 views 次

在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。我国古代称为“河图”、“洛书”,又叫“纵横图”。下图便是著名的“洛书”——在数学上叫“三阶幻方”:

对于三阶幻方,金庸在《射雕英雄传》里有一段精彩的描述,其中有段口诀朗朗上口——“二四为肩,六八为足,左七右三,足九履一,五居其中”。

在幻方中,一共有三种类型:奇数阶幻方(n=2k+1),单偶数阶幻方(n=2(2k+1)),双偶数阶幻方(n=4k)。其中尤以奇数阶幻方最为简单,单偶数阶最为复杂。奇数阶幻方有多种构造方法,其中最著名的要数“阶梯法”了。

阶梯法方法如下:

  1. 1位于第一行中间;
  2. 每一个数放在前一个数的右上一格;
  3. 如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
  4. 如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
  5. 如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
  6. 如果这个数所要放的格已经有数填入,处理方法同4.

经过以上六步构造,一个高阶奇数幻方就出来了。

利用python构造一个奇数幻方的代码如下:

 Python | 
 
 copy code |
?

01
#!/usr/bin/env python3
02
#奇阶幻方构造——阶梯法
03
n=int(input("请输入一个奇数(n<=19):"))
04
Magic=[([0]*n)for i in range(n)]
05
i=0
06
j=(n-1)//2
07
Magic[i][j]=1
08
for m in range(2,n*n+1,1):
09
    i0=i
10
    j0=j
11
    i=(i+n-1)%n
12
    j=(j+n+1)%n
13
    if Magic[i][j]!=0:
14
        i=(i0+n+1)%n
15
        j=j0
16
    if i0==0 and j0==n-1:
17
        i=1
18
        j=n-1
19
    Magic[i][j]=m
20
for i in range(n):
21
    for j in range(n):
22
        print("%3d"%Magic[i][j],end=' ')
23
    print()
24
input("Press <Enter> to end")
25

0

目前有 5 条留言    访客:4 条, 博主:1 条

  1. giant888 2012年04月22日 下午3:03  @回复  Δ-49楼 回复
    Firefox Firefox Windows Windows

    这玩意有点麻烦啊。

  2. OOZJ 2012年04月22日 下午1:16  @回复  Δ-48楼 回复
    Google Chrome Google Chrome Windows Windows

    第一次来访留个记号

  3. tusooa 2012年04月22日 上午8:24  @回复  Δ-47楼 回复
    Firefox Firefox GNU/Linux GNU/Linux

    你这comment的边上,老闪个`留言无头'


    • 管理员
      hsyyf 2012年04月22日 上午10:29  @回复  ∇地下1层 回复
      Firefox Firefox Windows Windows

      很多人无头的,提醒一下嘛。。。

  4. tusooa 2012年04月22日 上午8:23  @回复  Δ-46楼 回复
    Firefox Firefox GNU/Linux GNU/Linux

    其实不止这一种方法。(废话。)阶梯怎么摆,都可以试一试。

给我留言

留言无头像?


×