hab das auch mal gecodet in
VB.NET.
Ich hab jetzt einfach mal ein SudokuFeld (als Array) initialisiert das komplett leer ist.
Das Programm braucht 0.0156250 Sekunden um es aufzulösen (also ca. 16 Millisekunden wenn ich das richtig seh?)
Hier der Lösungsalgorithmus:
Code:
Private field(9, 9) As Integer
Private line As Integer = 0
Public Function solve() As Boolean
For x As Integer = line To 8
For y As Integer = 0 To 8
'Wenn das aktuelle Feld nicht besetzt ist
If field(x, y) = 0 Then
For val As Integer = 1 To 9
'Setze Zahl
field(x, y) = val
'Wenn Zahl gültig ist
If fieldValid() Then
line = x
'rekursiver Aufruf
If solve() Then
'wenn gesetzte Zahl richtig war -> beende Schleife
'wenn nicht -> setze Schleife fort = setze nächste Zahl in Feld
Exit For
End If
'Wenn die Zahl nicht gültig ist
Else
'Wenn die Zahl im aktuellen Feld 9 ist -> setze Feld zurück
'und return false
If val = 9 Then
field(x, y) = 0
Return False
End If
End If
Next
End If
Next
Next
Return True
End Function und hier noch die Funktion zur Überprüfung auf Gültigkeit:
Code:
Private Function fieldValid() As Boolean
Dim numbers1to9(9) As Integer
numbers1to9(1) = 0
numbers1to9(2) = 0
numbers1to9(3) = 0
numbers1to9(4) = 0
numbers1to9(5) = 0
numbers1to9(6) = 0
numbers1to9(7) = 0
numbers1to9(8) = 0
numbers1to9(9) = 0
Dim i As Integer
Dim j As Integer
'---------Überprüfung aller 3x3 Kasten------------------
For i = 0 To 6 Step 3 'x
For j = 0 To 6 Step 3 'y
For k As Integer = j To j + 2 Step 1 'y
For l As Integer = i To i + 2 Step 1 'x
'Wenn das aktuelle Feld 1-9 als Inhalt hat -> Erhöhund des entsprechenden Zählers
If field(k, l) = 1 Or field(k, l) = 2 Or field(k, l) = 3 _
Or field(k, l) = 4 Or field(k, l) = 5 Or field(k, l) = 6 _
Or field(k, l) = 7 Or field(k, l) = 8 Or field(k, l) = 9 Then
numbers1to9(field(k, l)) += 1
End If
Next
Next
'Wenn eine Zahl öfters als ein mal vor kommt -> ungültig
If numbers1to9(1) > 1 OrElse numbers1to9(2) > 1 OrElse numbers1to9(3) > 1 _
OrElse numbers1to9(4) > 1 OrElse numbers1to9(5) > 1 OrElse numbers1to9(6) > 1 _
OrElse numbers1to9(7) > 1 OrElse numbers1to9(8) > 1 OrElse numbers1to9(9) > 1 Then
Return False
End If
numbers1to9(1) = 0
numbers1to9(2) = 0
numbers1to9(3) = 0
numbers1to9(4) = 0
numbers1to9(5) = 0
numbers1to9(6) = 0
numbers1to9(7) = 0
numbers1to9(8) = 0
numbers1to9(9) = 0
Next
Next
'-------------------------------------------------------------------
'---------Überprüfung aller Reihen nacht unten----------------------
For i = 0 To 8
For j = 0 To 8
'Wenn das aktuelle Feld 1-9 als Inhalt hat -> Erhöhund des entsprechenden Zählers
If field(i, j) = 1 Or field(i, j) = 2 Or field(i, j) = 3 _
Or field(i, j) = 4 Or field(i, j) = 5 Or field(i, j) = 6 _
Or field(i, j) = 7 Or field(i, j) = 8 Or field(i, j) = 9 Then
numbers1to9(field(i, j)) += 1
End If
Next
'Wenn eine Zahl öfters als ein mal vor kommt -> ungültig
If numbers1to9(1) > 1 OrElse numbers1to9(2) > 1 OrElse numbers1to9(3) > 1 _
OrElse numbers1to9(4) > 1 OrElse numbers1to9(5) > 1 OrElse numbers1to9(6) > 1 _
OrElse numbers1to9(7) > 1 OrElse numbers1to9(8) > 1 OrElse numbers1to9(9) > 1 Then
Return False
End If
numbers1to9(1) = 0
numbers1to9(2) = 0
numbers1to9(3) = 0
numbers1to9(4) = 0
numbers1to9(5) = 0
numbers1to9(6) = 0
numbers1to9(7) = 0
numbers1to9(8) = 0
numbers1to9(9) = 0
Next
'----------------------------------------------------------------------
'----------- Überprüfung aller Reihen nach Rechts----------------------
For i = 0 To 8
For j = 0 To 8
'Wenn das aktuelle Feld 1-9 als Inhalt hat -> Erhöhund des entsprechenden Zählers
If field(j, i) = 1 Or field(j, i) = 2 Or field(j, i) = 3 _
Or field(j, i) = 4 Or field(j, i) = 5 Or field(j, i) = 6 _
Or field(j, i) = 7 Or field(j, i) = 8 Or field(j, i) = 9 Then
numbers1to9(field(j, i)) += 1
End If
Next
'Wenn eine Zahl öfters als ein mal vor kommt -> ungültig
If numbers1to9(1) > 1 OrElse numbers1to9(2) > 1 OrElse numbers1to9(3) > 1 _
OrElse numbers1to9(4) > 1 OrElse numbers1to9(5) > 1 OrElse numbers1to9(6) > 1 _
OrElse numbers1to9(7) > 1 OrElse numbers1to9(8) > 1 OrElse numbers1to9(9) > 1 Then
Return False
End If
numbers1to9(1) = 0
numbers1to9(2) = 0
numbers1to9(3) = 0
numbers1to9(4) = 0
numbers1to9(5) = 0
numbers1to9(6) = 0
numbers1to9(7) = 0
numbers1to9(8) = 0
numbers1to9(9) = 0
Next
'----------------------------------------------------------------------
Return True
End Function
Ich hab das ganze auch mal gecodet mit Algorithmen die das Sudoku durch Logik lösen (und Trial&Error falls mit Logik nichts mehr geht). Der Code ist allerdings wesentlich länger. Aber falls jemand Interesse hat kann ich den ja auch mal posten.
P.S.: Wie kann man hier Hide machen? Find des ned