76 lines
1.7 KiB
Plaintext
76 lines
1.7 KiB
Plaintext
Randomize Timer
|
|
|
|
Sub printSquare(latin() As Integer, n As Integer)
|
|
For i As Integer = 0 To n - 1
|
|
Print "[";
|
|
For j As Integer = 0 To n - 1
|
|
Print latin(i, j); ",";
|
|
Next j
|
|
Print Chr(8); " ]"
|
|
Next i
|
|
Print
|
|
End Sub
|
|
|
|
Sub latinSquare(n As Integer)
|
|
Dim As Integer i, j, k
|
|
|
|
If n <= 0 Then
|
|
Print "[]"
|
|
Exit Sub
|
|
End If
|
|
Dim latin(n - 1, n - 1) As Integer
|
|
For i = 0 To n - 1
|
|
For j = 0 To n - 1
|
|
latin(i, j) = j
|
|
Next j
|
|
Next i
|
|
|
|
' first row
|
|
For i = 0 To n - 1
|
|
Dim j As Integer = Int(Rnd * n)
|
|
Swap latin(0, i), latin(0, j)
|
|
Next i
|
|
|
|
' middle row(s)
|
|
For i = 1 To n - 2
|
|
Dim shuffled As Integer = 0
|
|
While shuffled = 0
|
|
For j = 0 To n - 1
|
|
Dim k As Integer = Int(Rnd * n)
|
|
Swap latin(i, j), latin(i, k)
|
|
Next j
|
|
shuffled = 1
|
|
For k As Integer = 0 To i - 1
|
|
For j = 0 To n - 1
|
|
If latin(k, j) = latin(i, j) Then
|
|
shuffled = 0
|
|
Exit For
|
|
End If
|
|
Next j
|
|
If shuffled = 0 Then Exit For
|
|
Next k
|
|
Wend
|
|
Next i
|
|
|
|
' last row
|
|
For j = 0 To n - 1
|
|
Dim used(n - 1) As Integer
|
|
For i = 0 To n - 2
|
|
used(latin(i, j)) = 1
|
|
Next i
|
|
For k = 0 To n - 1
|
|
If used(k) = 0 Then
|
|
latin(n - 1, j) = k
|
|
Exit For
|
|
End If
|
|
Next k
|
|
Next j
|
|
printSquare(latin(), n)
|
|
End Sub
|
|
|
|
latinSquare(5)
|
|
latinSquare(5)
|
|
latinSquare(10) ' for good measure
|
|
|
|
Sleep
|