Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Module SudokuGen
- Private Rnd As New Random
- Private Board(8, 8) As Cell
- 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()
- While True
- For x = 0 To 8
- For y = 0 To 8
- Board(x, y) = New Cell
- Next
- Next
- Dim ValidBlks As List(Of Byte) = New Byte() {0, 1, 2, 3, 4, 5, 6, 7, 8}.ToList
- Dim Retry As Boolean = False
- Do Until ValidBlks.Count = 0
- Dim ValidCells As List(Of Byte) = New Byte() {0, 1, 2, 3, 4, 5, 6, 7, 8}.ToList
- Dim B As Byte = ValidBlks(Rnd.Next(ValidBlks.Count))
- ValidBlks.Remove(B)
- Do Until ValidCells.Count = 0
- Dim C As Byte = ValidCells(Rnd.Next(ValidCells.Count))
- Dim X As Byte = Blks(B, C, 0), Y As Byte = Blks(B, C, 1), N As Byte = 0
- If Board(X, Y).Process(N) Then
- Retry = True
- Exit Do
- Else
- ValidCells.Remove(C)
- For i = 0 To 8
- Board(X, i).ValidNbrs.Remove(N) : Board(i, Y).ValidNbrs.Remove(N)
- Board(Blks(B, i, 0), Blks(B, i, 1)).ValidNbrs.Remove(N)
- Next
- End If
- Loop
- If Retry Then Exit Do
- Loop
- If Not Retry Then Exit While
- End While
- Console.Write(vbCrLf)
- For X = 0 To 2
- Console.Write(" ")
- For Y = 0 To 2 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(" ")
- For Y = 3 To 5 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(" ")
- For Y = 6 To 8 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(vbCrLf)
- Next
- Console.Write(vbCrLf)
- For X = 3 To 5
- Console.Write(" ")
- For Y = 0 To 2 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(" ")
- For Y = 3 To 5 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(" ")
- For Y = 6 To 8 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(vbCrLf)
- Next
- Console.Write(vbCrLf)
- For X = 6 To 8
- Console.Write(" ")
- For Y = 0 To 2 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(" ")
- For Y = 3 To 5 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(" ")
- For Y = 6 To 8 : Console.Write(Board(X, Y).Value & " ") : Next
- Console.Write(vbCrLf)
- Next
- End Sub
- Public Class Cell
- Public Value As Byte = 0
- Public ValidNbrs As List(Of Byte) = New Byte() {1, 2, 3, 4, 5, 6, 7, 8, 9}.ToList
- Public Function Process(ByRef SelectedNbr As Byte) As Boolean
- If ValidNbrs.Count = 0 Then Return True
- Value = ValidNbrs(Rnd.Next(ValidNbrs.Count))
- SelectedNbr = Value
- Return False
- End Function
- End Class
- End Module
Advertisement
Add Comment
Please, Sign In to add comment