用罗伯法构造幻方
幻方是一种广为流传的数学游戏,据说早在大禹治水时就发现过。幻方的特点是:由自然数构成n×n正方形阵列,称为n阶幻方,每一行、每一列、两对角线上的数之和相等。法国人罗伯总结出了构造奇数阶连续自然数幻方的简单易行的方法“罗伯法”。下表就是一个用罗伯法排好的5阶幻方。(

)
罗伯法的具体方法如下:
把1(或最小的数)放在第一行正中;
按以下规律排列剩下的n2-1个数:
1)每一个数放在前一个数的右上一格;
2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
4)如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
5)如果这个数所要放的格已经有数填入,处理方法同4)。
只要是有规律的东西,计算机很容易就可以做到。
下面我们把罗伯法翻译成计算机算法思路:
定义一个n×n数组;
把1放在第0行第n\2列;
设当前格为(i,j),设一步长变量k(k=2->n*n)
1) i减1,j加1;
2) 如果i<0那么i=n-1;
3) 如果j>n-1那么j=0;
4) 如果2)和3)同时出现那么就把j减回1,i加上2;
5) 如果a(i,j)不为空那么按照4)处理;
6) 把k的值赋给当前格a(i,j);
继续循环;
输出幻方阵。
下面是VB代码,在窗体上设置一Label标签框,标题设为空,AutoSize设为True。
Option Explicit
Dim i,j,n,k As Integer
Dim a() As Integer
Private Sub Form_Load
n = InputBox("输入幻方的阶数","幻方",3)
ReDim a(n,n) As Integer '定义动态数组
For i = 0 To n - 1
For j = 0 To n - 1
a(i,j) = 0 '初始化变量
Next j
Next i
j = Int(n/2)
a(0,j) = 1 '1放在第一行正中
For k = 2 To n ^ 2
i = i - 1
j = j + 1 '向右上方向填数
If i < 0 And j > n - 1 Then
i = i + 2
j = j - 1 '如果右上出界那么把下一个数放在前一个数的下方一格
Else
If i < 0 Then i = n - 1 '如果上出界那么把下一个数放在上一列的底行
If j > n - 1 Then j = 0 '如果右出界那么把下一个数放在上一行的最左列
End If
If a(i,j) = 0 Then '如果将要排的位置还没有填数那么直接填数
a(i,j) = k
Else '否则就把下一个数填在前一个数的下方的一格
i = i + 2
j = j - 1
a(i,j) = k
End If
Next k
For i = 0 To n - 1 '输出幻方
For j = 0 To n - 1
Label1.Caption = Label1.Caption + LTrim(Str(a(i,j)))+ " "
Next j
Label1.Caption = Label1.Caption + Chr(13)
Next i
End Sub
本代码在VB6调试通过。代码可在此下载http://go.163.com/~betterprogram。