Sudoku mehrere Lösungen

Java xyrse123

Bekanntes Mitglied
Hallo,
Ich habe ein Programm gemacht das ein Sudoku rekursiv mit Backtracking löst.
Dabei wird aber nur eine Lösung ausgegeben. Ich würde gerne noch einen Zähler einbauen der die Anzahl der Lösungen angibt.
Wie könnte ich die Anzahl aller Lösungen bestimmen?
 

JStein52

Top Contributor
Ist denn dein Algorithmus überhaupt darauf angelegt alle Lösungen zu finden oder bricht er nach der ersten gefundenen ab ?
 

Robat

Top Contributor
Wenn dein Algorithmus nach der ersten Lösung abbricht dann brauchst du auch keinen Zähler einbauen.. du wirst immer nur eine Lösung bekommen.
Schreib dein Algorithmus doch erstmal so um dass er dir alle Lösungen generiert und ausgibt. Danach kannst du immer noch mit einem Zähler mitzählen wie viele Lösungen es sind.
 

Robat

Top Contributor
Pauschal gesagt musst du jede Möglichkeit ausprobieren. Wenn du eine Möglichkeit gefunden hast darfst du nicht abbrechen sondern dein Algo muss sich erneut aufrufen / weiter machen.
Das kommt aber auch ein bisschen drauf an wie dein Algo funktioniert / aufgebaut ist.
 

Java xyrse123

Bekanntes Mitglied
Hier ist meine Lösemethode:
Java:
static boolean solve(int i, int j, int Matrix[][]) {
        aufrufe++;
        if (i == 9 && j == 8)
            return true; // rechtes unteres Feld erreicht,abbruch

        if (i == 9) { // Eine Zeile weiter nach unten
            i = 0;
            j++;
        }

        if (Matrix[i][j] != 0) { // Nur Felder mit 0 sollen verändert werden           
            return solve(i + 1, j, Matrix); // -> gehe einen Schritt weiter
        }

        for (int value = 1; value <= 9; value++) { // Alle Zahlen von 1-9 werde getestet
            if (check(i, j, value, Matrix) == true) { // Gehe auf nächstes freies Feld
                Matrix[i][j] = value; // setze den Wert
                if (solve(i + 1, j, Matrix) == true)                   
                    return true;           
            }
        }
        Matrix[i][j] = 0; // Feld wird auf Null gesetzt(backtrack)
        return false;
    }
Dann müsste ich die oberste Abbruchbedingung ändern. Die Lösemethode muss dann ja immer weiter aufgerufen werden, um neue Lösungen zufinden, aber was ist dann die Abbruchbedingung dafür?
 

truesoul

Top Contributor
Hier ist meine Lösemethode:
Java:
static boolean solve(int i, int j, int Matrix[][]) {
        aufrufe++;
        if (i == 9 && j == 8)
            return true; // rechtes unteres Feld erreicht,abbruch

        if (i == 9) { // Eine Zeile weiter nach unten
            i = 0;
            j++;
        }

        if (Matrix[i][j] != 0) { // Nur Felder mit 0 sollen verändert werden          
            return solve(i + 1, j, Matrix); // -> gehe einen Schritt weiter
        }

        for (int value = 1; value <= 9; value++) { // Alle Zahlen von 1-9 werde getestet
            if (check(i, j, value, Matrix) == true) { // Gehe auf nächstes freies Feld
                Matrix[i][j] = value; // setze den Wert
                if (solve(i + 1, j, Matrix) == true)                  
                    return true;          
            }
        }
        Matrix[i][j] = 0; // Feld wird auf Null gesetzt(backtrack)
        return false;
    }
Dann müsste ich die oberste Abbruchbedingung ändern. Die Lösemethode muss dann ja immer weiter aufgerufen werden, um neue Lösungen zufinden, aber was ist dann die Abbruchbedingung dafür?

Also deine Methode zählt nicht die Lösungen die möglich sind sondern nur die Aufrufe von der Methode.
Schon mal mein Beispiel dir angeschaut?

Grüße
 

Java xyrse123

Bekanntes Mitglied
Dein Beispiel habe ich mir angesehen, aber es war mir zu kompliziert und ich habe es nicht wirklich verstanden.
Ich weiß das ich mit der Variable "aufrufe", nur die Anzahl der Aufrufe der Methode und nicht nicht die Anzahl der Lösungen bestimme.
Ich hatte die solve() nur gepostet damit mir vielleicht jemand einen Ansatz gibt, wo ich etwas verändern müsste damit ich die Anzahl aller Lösungen bestimmen kann.
 

Meniskusschaden

Top Contributor
Dann müsste ich die oberste Abbruchbedingung ändern. Die Lösemethode muss dann ja immer weiter aufgerufen werden, um neue Lösungen zufinden, aber was ist dann die Abbruchbedingung dafür?
Es gibt doch eine Stelle, an der du weisst, dass du eine Lösung gefunden hast. Dort kannst du deinen Zähler erhöhen und dem Aufrufer "vortäuschen", dass keine Lösung gefunden wurde. Das heisst, du musst nicht die Abbruchbedingung ändern, sondern die Information, die du zurück lieferst.
 

Java xyrse123

Bekanntes Mitglied
Ich habs denke ich einigermaßen verstanden, aber wenn ich folgendes ändere wird das Sudoku unverändert ausgegeben.
Code:
static int anzahl=0;

static boolean solve(int i, int j, int Matrix[][]) {
if (i == 9 && j == 8) {           
            anzahl++;                    
        }
       
    if(anzahl<=1 ) {         
        return true; // Sudoku eindeutig
    }
}
 

Java xyrse123

Bekanntes Mitglied
Wenn ich nur folgendes ändere kann ich es aber nicht lösen, oder meintest du was anderes?
Code:
static int anzahl=0;

static boolean solve(int i, int j, int Matrix[][]) {
if (i == 9 && j == 8) {           
                anzahl++;       
            return false; 
       
        }
 }
 

Java xyrse123

Bekanntes Mitglied
Nein, könnte es daran liegen das in der Mainmethode das hier steht:
Code:
if (solve(0, 0, Matrix) == true) // wenn Sudoku lösbar ->
            print(Matrix); // wird es ausgegeben

        else
            System.out.println("Keine Lösung");
Es wird halt immer "keine Lösung" ausgegeben wie ich weiter oben schon geschrieben hatte.
Edit: Wenn ich das mit dem if wegnehme wird nur das ungelöste Sudoku gedruckt
 

Java xyrse123

Bekanntes Mitglied
Wenn ich die Ausgabe so mache, wird auch nur das unausgefüllte Sudoku gedruckt.
In der der solve() Methode wird doch auch nirgendwo true zurückgegeben.
Code:
solve(0, 0, Matrix);
print(Matrix);
 

Meniskusschaden

Top Contributor
Wenn ich die Ausgabe so mache, wird auch nur das unausgefüllte Sudoku gedruckt.
In der der solve() Methode wird doch auch nirgendwo true zurückgegeben.
Ja. Natürlich. Es ist doch gerade der "Trick" an der Sache, dass jede gefundene Lösung "verworfen" wird, damit weiter gesucht wird. Also ist die Matrix zum Schluß wieder in ihrem Ausgangszustand. Das sagt aber nichts darüber aus, ob in der Zwischenzeit alle Lösungen korrekt gefunden wurden oder ob noch etwas falsch ist. Warum gibst du die Matrix nicht einfach mal bei jeder Lösung aus und siehst dir an, ob es korrekt ist?
 

Java xyrse123

Bekanntes Mitglied
Achso.
Code:
int anzahl=0;
solve(...){
If(i==9 && j==8) {
anzahl++;
print(Matrix);
System.out.println(anzahl);
return false;
}
}
 

Java xyrse123

Bekanntes Mitglied
Jetzt ist doch noch ein Problem aufgetreten.
Ich habe ein Sudoku eingegeben und es hat mir angezeigt das es 2 Lösungen gibt, aber es wurden 2 Mal die gleiche Lösung ausgegeben.

Edit: Es wurden nur 2 Zahlen vertauscht, hat sich geklärt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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 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
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
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
G Sudoku rekursiv lösen Java Basics - Anfänger-Themen 10
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
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
Buroto Klassen Mehrere .txt Datein verbienden und anschließend auslisten Java Basics - Anfänger-Themen 10
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Kotelettklopfer Mehrere Projekte in einem Git verwalten Java Basics - Anfänger-Themen 10
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
M mehrere Rückgabenwerte aus Methode Java Basics - Anfänger-Themen 7
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
C Mehrere Zufallswerte Java Basics - Anfänger-Themen 4
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
O Datei in mehrere kleine Dateien umwandeln Java Basics - Anfänger-Themen 47
Henri Mehrere Ordner umbenennen Java Basics - Anfänger-Themen 11
E Mehrere Arrays addieren mit Übertrag Java Basics - Anfänger-Themen 13
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
J Mehrere paintComponenten in einem Programm Java Basics - Anfänger-Themen 0
F Mehrere Buttons mit einem ActionListener abdecken Java Basics - Anfänger-Themen 24
B Jeweils den Parent bekommen -> mehrere Ebenen Java Basics - Anfänger-Themen 2
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
L Mehrere Jars im Unterordner Java Basics - Anfänger-Themen 2
L LibGDX - mehrere Screens Java Basics - Anfänger-Themen 1
F Mehrere Instanzen der Klasse A EINER Instanz der Klasse B übergeben Java Basics - Anfänger-Themen 3
T Mehrere JFrames gleichzeitig öffnen Java Basics - Anfänger-Themen 6
O Erste Schritte Scanner mehrere male benutzen (Konsole) Java Basics - Anfänger-Themen 7
S mehrere If Bedingungen Java Basics - Anfänger-Themen 5
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
B Mehrere Zahlen speichern Java Basics - Anfänger-Themen 60
M mehrere extends? Java Basics - Anfänger-Themen 19
N Datei Zeilenweise einlesen, Ausgabe mehrere Arrays Java Basics - Anfänger-Themen 7
C ButtonController löst mehrere Methoden aus Java Basics - Anfänger-Themen 5
D JPanel mehrere Formen zeichnen Java Basics - Anfänger-Themen 5
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
F mehrere eingegebene Zahlen mit Zahlen von 1-9 multiplizieren Java Basics - Anfänger-Themen 18
F Mehrere Konstruktoren? Wofür? Java Basics - Anfänger-Themen 21
J Mehrere Eingabefelder programmiert (Zeigt Fehler an) Java Basics - Anfänger-Themen 6
Jinnai4 Mehrere Textfelder überprüfen Java Basics - Anfänger-Themen 16
N Mehrere Forms auf einem Panel Java Basics - Anfänger-Themen 6
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
D Mehrere Objekte in ein Objekt zusammenfassen Java Basics - Anfänger-Themen 16
D Input/Output Mehrere Befehle nacheinander ausführen Java Basics - Anfänger-Themen 20
K Mehrere Objekte anlegen Java Basics - Anfänger-Themen 23
N Integers aus Textdatei auslesen und mehrere Arrays erstellen Java Basics - Anfänger-Themen 9
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
J MVC Pattern, mehrere Controller/Views/Models Java Basics - Anfänger-Themen 0
J Mehrere IF Anweisungen und dazugehörige ELSE Java Basics - Anfänger-Themen 6
I Klassen Mehrere Java Klassen in einer .java Datei Java Basics - Anfänger-Themen 7
V Mehrere Dateien aus JFileChooser in eine ArrayList speichern Java Basics - Anfänger-Themen 2
F Mehrere Konstruktoren Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben