Einzelnen Beitrag anzeigen
Alt 11.10.09, 14:10   #33 (permalink)
Gaux
 
Registriert seit: 11.10.09
Gaux Leistung: Facit NTK
Likes: 0
Standard

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
Gaux ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61