[奇數魔方陣] 奇數魔方陣是一種將 1 到 N2 的數字,排列在 N × N 的陣列上,其
中 1 < N < 20 且 N 必須為奇數,且各列(水平走向)、各行(垂直走向)與各對
角線的加總必須相同;舉例來說,如下圖 I 所示(N = 3),每一列、每一行及對角
線的加總皆為 15。填魔方陣的方法是將數字 1 放在第一列的正中央,然後向右上填,
若超出上邊界就跳到同一行的下邊界繼續(如圖 B、I 所示),若超出右邊界就跳到
同一列的左邊界繼續(如圖 C、H 所示),如果右上已有數字,則向下填(如圖 D、
G 所示,圈圈代表右上已經有數字)。




輸入/輸出說明:請在表單上建立 1個 LABEL、2個 TEXTBOX及一個按鈕。LABEL表示「輸入方陣維度 N」,相對應的第 1個 TEXTBOX可以輸入維度 N,按下按鈕後,在第 2個 TEXTBOX中印出 N×N 奇數魔方陣,各數字間以空格隔開;注意,若輸入 N 為偶數時,請於第 2個 TEXTBOX中印出 “N需大於 1且 N為奇數” 的訊息。程式執行順序:輸入 N,按下按鈕,輸出。

家豪版

這一版增加了視窗自動調大小的動做(如下紅色指令碼),其實比賽可以省略,
除非全部做完了,可以花一些時間在美觀。

Dim n As Integer = Val(TextBox1.Text)
Dim dx As Integer, dy As Integer, x As Integer, y As Integer
Dim xy(19,19) As Integer
If (n Mod 2 = 0) Then
    TextBox2.Text = "N 需大於 1 且 N 為奇數"
    Exit Sub
ElseIf ((n > 19) Or (n < 3)) Then
    MsgBox("n 值錯誤(1<N<20),請重新輸入。")
    Exit Sub
End If
TextBox2.Width = n * 61.5 : TextBox2.Height = n * 31 + 2
x = TextBox2.Left + TextBox2.Width : y = TextBox2.Top + TextBox2.Height
Me.Width = If(x < Button1.Left + Button1.Width + 30, Button1.Left + Button1.Width + 30, x + TextBox2.Left - 70)
Me.Height = Button1.Top + Button1.Height + y

TextBox2.Text = "" : x = n \ 2 : y = 0 : dx = 1 : dy = n - 1
For i = 1 To n * n
    If (xy(x, y) <> 0) Then "碰撞
        x = (x - dx + n) Mod n
        y = (y - dy + n + 1) Mod n "退回後,往後退一格
    End If
    xy(x, y) = i
    x = (x + dx) Mod n : y = (y + dy) Mod n
Next
For y = 0 To n - 1
    For x = 0 To n - 1
        TextBox2.Text = TextBox2.Text & String.Format("{0,4}", xy(x, y))
    Next
    TextBox2.Text = TextBox2.Text & vbNewLine
Next





昊朋版

Dim n As Integer = Val(TextBox8.Text)
If (n Mod 2 = 0) Or (n < 1) Then
    TextBox9.Text = "N 需大於 1 且 N 為奇數"
    Exit Sub
End If
TextBox9.Text = ""
Dim a(n, n) As Integer
For i = 1 To n
    For j = 1 To n
        a(i, j) = 0
    Next
Next
Dim x As Integer = 1, y As Integer = 1
x = (n + 1) / 2
For i = 1 To n * n
    a(x, y) = i
    If Not a(IIf(x + 1 > n, 1, x + 1), IIf(y - 1 < 1, n, y - 1)) = 0 Then
        y = IIf(y + 1 > n, n, y + 1)
    Else
        x = IIf(x + 1 > n, 1, x + 1)
        y = IIf(y - 1 < 1, n, y - 1)
    End If
Next
For i = 1 To n
    For j = 1 To n
        TextBox9.Text &= a(j, i) & " "
    Next
    TextBox9.Text &= vbNewLine
Next

黃翰版

Dim n As Integer = val(TextBox1.Text)
Dim i, j As Integer
Dim x, y, dy As Integer
Dim bx, by As Integer
Dim str As String = ""
Dim arr(n, n) As Integer
If n >= 20 Then
    MsgBox("您輸入的N>19")
    Exit Sub
ElseIf n Mod 2 = 0 Or n <= 1 Then
    MsgBox("N 需大於 1 且 N 為奇數")
    Exit Sub
End If
x = (n - 1) \ 2
y = 0
dy = n - 1
arr(x, y) = 1

For i = 2 To n * n
    bx = (x + 1) Mod n
    by = (y + dy) Mod n
    If arr(bx, by) = 0 Then
        x = bx
        y = by
    Else
        y += 1
    End If
    arr(x, y) = i
Next
For i = 0 To n - 1
    For j = 0 To n - 1
        str &= arr(j, i) & " "
    Next
    str &= vbCrLf
Next
TextBox2.Text = str