奇数n阶幻方是指由自然数1、2、…、n2组成的n×n的方阵,其中每个元素值都不相等,且每行、每列与对角线上的n个元素之和都相等。
N阶幻方的构造方法有很多种,下面是“右上方填数法”的算法:
⑴将1放在第一行中间一列;
⑵2~n2依次填在上一个数的右上方位置(即行减1列加1):
若上一个数的行数为1时,则当前数的行数为n;
若上一个数的列数为n时,则当前数的列数为1。
⑶如果按上面规则确定的位置上已有数,则把当前数放在上一个数的下面。
例如当n为3时,如图a所示,1在第1行第2列,则2的位置为第3行第3列;
再如3在第2行第1列,则4的位置应为第1行第2列,但该位置已有数,因此4就放在3所在位置的正下面。
“左上方填数法”的方法类似于“右上方填数法”,以3阶幻方为例,“右上方填数法”和“左上方填数法”所构造的幻方如下图a、图b所示。
| |
图a 右上方填数法 | 图b 左上方填数法 |
小明采用“左上方填数法”的方法设计了如下程序。
Private Sub Command1_Click()
Dim a(1 To 100) As Integer
Dimx As Integer,y As Integer,x1 As Integer,y1 As Integer
Dim n As Integer, s As Integer,pos As Integer, st As String
n = Val(Text1.Text)
For i = 1 To n * n
a(i) = 0
Next i
s = 1
x = 1
y = (n + 1) \ 2
a(y) = s
Do While ①
s = s + 1
x1 = x: y1 = y
x = x - 1
y = y - 1
If x < 1 Then x = n
If y < 1 Then y = n
If a((x - 1) * n + y) > 0 Then ② : y = y1
③
a(pos) = s
Loop
st = ""
For i = 1 To n * n
st = st + wid(a(i))
If i Mod n = 0 Then
List1.AddItem st
st = ""
End If
Next i
End Sub
'自定义函数wid的功能是使数字在方阵对齐
Function wid(p As Integer) As String
'代码省略
End Function
请回答下列问题: