Sudoku Rekursiv lösen

M

Mc Noise

Gast
Hallo,

ich habe ein Programm zum lösen von Sudokus geschrieben. Das logische lösen des Sudoku klappt. Meine Vorgehensweise ist die Folgende, ich habe ein 2d Array mit 9*9 Objekte der Klasse SudokuZelle. Die Klasse hat die Fähigkeit für jede Zelle ungültige Werte auszuschließen, eindeutige Werte und alle noch möglichen Werte der einzelnen Zelle zu liefern.

Durch das Ausschließen der Werte erhalte ich eine Kandidatenliste für jede Zelle.
Jetzt möchte ich auch Sudokus lösen, bei dennen es keinen eindeutigen Werte für jede Zelle gibt.

Eine Methode zur Überpüfung, ob das Sudoku wiederspruchsfrei gelöst ist habe ich, das systematische durchprobieren der Kandidatenliste bereitet mir allerdings Kopfzerbrechen.

Danke schonmal für eure Hilfe.
 

Kekzii

Mitglied
Sudoku ist/kann ein kompliziertes Spiel sein...

wenn es keine eindeutigen Werte gibt dann ist das pures ausprobieren ;) heisst du müsstest jede möglichkeit ausprobieren und auf ihre Richtigkeit prüfen

also erst alle eindeutigen Felder ausfüllen und wenn keine eindeutigen Felder mehr übrig sind ausprobieren ansonsten kann es sehr schwer werden einem Programm so ein logisches denken zu vermitteln das es richtig lösen kann ;)
 
M

Mc Noise

Gast
Hallo,

so hab ich mir das auch gedacht, mein Problem ist das Entwickeln einer Methode, welche systematisch meine Kanditaten für jede Zelle durchprobiert.
 

nrg

Top Contributor
genau. hier ist die sequenzielle vorgehenweiße anhand vom "Acht-Damen-Problem" sehr schön zu sehen:
(quelle: wikipeidia)
Eight-queens-animation.gif


sieht glaub schlimmer aus, als es ist. wird halt ne ziehmlich große iteration, die auch gern mal einige zeit in anspruch nehmen kann.
 

Kekzii

Mitglied
gehts nicht iwie mit ner For-schleife? aber bestimmt sehr langsam..

Java:
for (int h = 0; h<feld.length;h++{
      for (int i = 0; i<feld.length;i++) {
           for (int j = 0; j<feld.length; j++){
                if (feld[i][j] == feld[h][i]){
                   ergebnis =false;
                 }
            }
        }
    }

oder so in der art :) keine ahnung obs klappen würde
 
G

Gast2

Gast
Hi,
ich hab auch mal nen SodukoSolver geschrieben. (falls du den ganzen code haben willst sag bescheid).
So in etwa habe ich das implementiert:

- Zuerst alle freien Stellen im Sudoku bestimmen und in einer Liste speichern.
- Danach rekursiv diese Stellen durchlaufen und für jede Stelle die Zahlen 1-9 durchprobieren.
- Wenn alle Stellen ausgefüllt sind und das Sudoku gültig ist, dann hast du eine Lösung gefunden.

Mal nen kleines beispiel:
Du setzt für die Stelle 1 die Zahl 1 ein. Nun prüfst du ob diese Zahl gültig ist, d.h. Spalte, Zeile und Box prüfen. Wenn die Zahl nicht gültig ist setzt du die Zahl 2 ein und prüfst wieder. Wenn die Zahl gültig ist machst du an der Stelle 2 weiter.
So durchläufst du den ganzen Lösungsbaum und kommst schlussendlich irgendwann zu deinen Lösungen.

Es gibt dann noch nen paar kniffe mit denen du das ganze noch ein wenig beschleunigen kannst.
 
M

Mc Noise

Gast
Genau so ist auch mein Gedankenansatz, nur die Umsetzung macht mir Probleme.
Ich habe nach dem durchführen des Ausschlußverfahrens mehrere Möglichkeiten für die einzelnen Sudokufelder. Würde mir schon reichen wenn er meine möglichen Werte durchprobiert.
Irgendwie fehlt mir die Vorstellung wie das rekursive lösen umzusetzen ist.

Wäre nett wenn du mir deinen Code schicken könntest.
 
G

Gast2

Gast
Java:
    private boolean solveBacktrack(int position) {
        if (position == missingFieldCount) { // Wenn alle Positionen besetzt sind => Lösung gefunden
            return true;
        }

        Point pos = missingFields.get(position); // missingFields ist ne Liste der freien Felder
        int row = (int)pos.getX();
        int column = (int)pos.getY();

        for (int i = 1; i <= maxNr; i++) {
            if (checkInsertValue(row, column, i)) { // prüft ob die Zahl i an der Stelle (row/column) gültig ist
                gridCalc[row][column] = i;
                if (solveBacktrack(position + 1)) { // wenn es ne Lösung gibt => algo beenden
                    return true;
                }
            }
        }

        // Dieser weg ist keine Lösung
        gridCalc[row][column] = 0;
        return false;
    }
Diese Methode gibt dir die erste mögliche Lösung aus. Lässt sich aber sehr leicht modifizieren, dass er z.b. alle Lösungen in einer Liste sammelt.
 
Zuletzt bearbeitet von einem Moderator:
M

Mc Noise

Gast
Hier mal meine Variante vielleicht hat jemand eine Idee wie ich das Backtracking implementieren kann?
[JAVA=42]

public void backtrackingVerfahren()
{
// Wenn das Sudoku geloest ist
if ((checkSumSpalten() && checkSummeZeilen()))
{
sudokuDisplayAusgabe();
System.exit(0);
}
// schließt den gesetzten Wert für die Zellen der Zeile, Spalte und dem Block aus
schliesseUngueltigeWerteAus();

for (int zeile = 0; zeile < sudoku.length; zeile++)
{
for (int spalte = 0; spalte < sudoku[zeile].length; spalte++)
{
// Wenn das Feld leer ist
if (sudoku[zeile][spalte].liefereWert() == 0)
{
// liefert dem nächstmoeglichen Wert oder -1 falls kein naechster Wert moeglich ist
int moeglicherWert = sudoku[spalte][spalte].liefereNaechstMoeglZahl();
// Es gibt einen moeglichen Wert
if (moeglicherWert > 0)
{
// Setzt in das Feld den naechstmoeglichen Wert
sudoku[zeile][spalte].setzeWert(moeglicherWert);
// schließt den gesetzten Wert für die Zellen der Zeile, Spalte und dem Block aus
schliesseUngueltigeWerteAus();
}
// Es gibt für dieses Feld keinen Wert
if(moeglicherWert == -1)
{
// Wiederspruch alle Werte fuer dieses Feld wurden ausgeschloßen
// hier sollte jetzt das Backtrackingverfahren beginnen
}
}
}
}
}



[/code]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
K Sudoku mit 2D Arrays Java Basics - Anfänger-Themen 19
B Sudoku prüfen Java Basics - Anfänger-Themen 13
S GUI-Programmierung Sudoku-Rätsel lösen Java Basics - Anfänger-Themen 1
J Sudoku mehrere Lösungen Java Basics - Anfänger-Themen 29
J Sudoku Blocküberprüfung Java Basics - Anfänger-Themen 9
S Sudoku Checker Frage Java Basics - Anfänger-Themen 1
G Sudoku Java Basics - Anfänger-Themen 3
S Methoden Java Sudoku Solver Java Basics - Anfänger-Themen 2
C Klassen Sudoku-Spiel Werte werden nicht gesetzt Java Basics - Anfänger-Themen 4
A Sudoku mit Backtracking lösen Java Basics - Anfänger-Themen 3
L Sudoku Backtracking Pseudocode Java Basics - Anfänger-Themen 3
L Sudoku Löser Java Basics - Anfänger-Themen 9
V Sudoku-Solver Probleme bei der Fehlerbehandlung Java Basics - Anfänger-Themen 12
H Unterquadrate bei Sudoku füllen Java Basics - Anfänger-Themen 9
D Sudoku lösen mit Backtracking Java Basics - Anfänger-Themen 20
M Sudoku-Löser: Fragen zu Pointer und Rekursion Java Basics - Anfänger-Themen 15
S Bisschen hilfe beim Sudoku Lösen benötigt Java Basics - Anfänger-Themen 7
X Sudoku Backtracking Java Basics - Anfänger-Themen 6
S Sudoku hilfe Java Basics - Anfänger-Themen 4
N Sudoku/BLocküberprüfung Java Basics - Anfänger-Themen 24
F Sudoku Grid zeichnen Java Basics - Anfänger-Themen 2
C Frage zu Sudoku Java Basics - Anfänger-Themen 20
MEETyA NullPointer Exception - Sudoku Java Basics - Anfänger-Themen 2
J Sudoku-ähnliche Aufgabe Java Basics - Anfänger-Themen 3
Antoras Sudoku Java Basics - Anfänger-Themen 3
F sudoku generieren Java Basics - Anfänger-Themen 16
B Sudoku! Java Basics - Anfänger-Themen 26
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
W Binomialkoeffizient iterativ/rekursiv Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben