Module SudokuGen
Private Rnd As New Random
Private Board(8, 8) As Cell
Private V As New Queue(Of Byte)
Private Blks(,,) As Byte = {{{0, 0}, {0, 1}, {0, 2}, {1, 0}, {1, 1}, {1, 2}, {2, 0}, {2, 1}, {2, 2}}, _
{{0, 3}, {0, 4}, {0, 5}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}}, _
{{0, 6}, {0, 7}, {0, 8}, {1, 6}, {1, 7}, {1, 8}, {2, 6}, {2, 7}, {2, 8}}, _
{{3, 0}, {3, 1}, {3, 2}, {4, 0}, {4, 1}, {4, 2}, {5, 0}, {5, 1}, {5, 2}}, _
{{3, 3}, {3, 4}, {3, 5}, {4, 3}, {4, 4}, {4, 5}, {5, 3}, {5, 4}, {5, 5}}, _
{{3, 6}, {3, 7}, {3, 8}, {4, 6}, {4, 7}, {4, 8}, {5, 6}, {5, 7}, {5, 8}}, _
{{6, 0}, {6, 1}, {6, 2}, {7, 0}, {7, 1}, {7, 2}, {8, 0}, {8, 1}, {8, 2}}, _
{{6, 3}, {6, 4}, {6, 5}, {7, 3}, {7, 4}, {7, 5}, {8, 3}, {8, 4}, {8, 5}}, _
{{6, 6}, {6, 7}, {6, 8}, {7, 6}, {7, 7}, {7, 8}, {8, 6}, {8, 7}, {8, 8}}}
Public Sub Main()
For Retry = 0 To 0
For x = 0 To 8 : For y = 0 To 8 : Board(x, y) = New Cell : Next : Next
Dim VB As List(Of Byte) = New Byte() {0, 1, 2, 3, 4, 5, 6, 7, 8}.ToList
Do Until VB.Count = 0 OrElse Retry
Dim VC As List(Of Byte) = New Byte() {0, 1, 2, 3, 4, 5, 6, 7, 8}.ToList
Dim B As Byte = VB(Rnd.Next(VB.Count)) : VB.Remove(B)
Do Until VC.Count = 0
Dim C As Byte = VC(Rnd.Next(VC.Count))
Dim X = Blks(B, C, 0), Y = Blks(B, C, 1), N As Byte = 0
Retry = Board(X, Y).Process(N)
If Retry Then Exit Do Else VC.Remove(C)
For i = 0 To 8
Board(X, i).VN.Remove(N) : Board(i, Y).VN.Remove(N)
Board(Blks(B, i, 0), Blks(B, i, 1)).VN.Remove(N)
Next : Loop : Loop
Next
For x = 0 To 8 : For y = 0 To 8 : V.Enqueue(Board(x, y).Val) : Next : Next
For y = 0 To 2 : For x = 0 To 2 : Console.WriteLine("{0} {1} {2} {3} {4} {5} {6} {7} {8}", _
V.Dequeue, V.Dequeue, V.Dequeue, V.Dequeue, V.Dequeue, V.Dequeue, _
V.Dequeue, V.Dequeue, V.Dequeue) : Next : Console.WriteLine()
Next
End Sub
Private Class Cell
Public Val As Byte = 0
Public VN As List(Of Byte) = New Byte() {1, 2, 3, 4, 5, 6, 7, 8, 9}.ToList
Public Function Process(ByRef SN As Byte) As Boolean
If VN.Count = 0 Then Return True Else Process = False
Val = VN(Rnd.Next(VN.Count)) : SN = Val
End Function
End Class
End Module