Sudoku Löser

Java xyrse123

Bekanntes Mitglied
Hallo,
ich wollte einen Sudoku Löser machen,aber ich komme jetzt nicht weiter. Ich verstehe nicht warum in der Ersten Spalte nur Nullen ausgeben werden. Vielleicht kann mir ja jemand einen Tipp geben.
Hier der Code:

Code:
public class SudokuSolver {
   
    static boolean solve(int i, int j,int Matrix[][]) {
        if(i==9 && j==8)
            return true; //rechtes unteres Feld erreicht
       
        if(i==9) { // Eine Zeile weiter nach unten
            i=0;
        j++;
        }   
       
       
        if (Matrix[i][j] != 0)  { // Nur Felder mit 0 sollen verändert werden                                          
             solve(i+1,j,Matrix);    //-> gehe einen Schritt weiter   
        }
       
           
            for(int value=1; value<=9; value++)    { // Alle Zahlen von 1-9 werde getestet           
                if(save(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
        return false;       
    }   
   
    static boolean save(int i,int j, int value, int Matrix[][]) {
        for(int k=0; k<9; k++) { // Zahl in Reihe doppelt
            if(value== Matrix[i][k])
                return false;
        }
        for(int k=0; k<9; k++) { // Zahl in Spalte doppelt
            if(value== Matrix[k][j])
                return false;
        }       
       
        // Block{
       
    //return false;  Zahl im 3*3 Block doppelt
        //}
       
        return true; // Zahl ist richtig   
}

    public static void print(int Matrix[][]) { // Sudoku Ausgabe
        System.out.printf("Lösung:");
        System.out.println();
        for (int x = 0; x < Matrix.length; x++) {
            for (int y = 0; y < Matrix.length; y++) {
            System.out.print(Matrix[x][y] + " ");
                                             
              }
            System.out.println();
                                                     }
                                        } 
   
    public static void main(String[] args) {
    int  Matrix[][] =         // Sudoku was gelöst wird
           
            new  int[][] {           { 1,0,0,0,0,0,0,0,3},
                                      { 4,6,0,0,0,0,7,0,0},
                                      { 6,0,5,0,0,8,0,0,0},
                                      { 0,7,0,8,0,2,0,3,0},
                                      { 0,0,2,0,9,0,0,0,0},
                                      { 0,0,0,0,7,0,0,0,5},
                                      { 0,0,0,0,0,9,4,0,0},
                                      { 0,8,0,4,0,0,0,0,1},
                                      { 3,0,0,0,0,1,0,8,6}};             
            solve(0, 0, Matrix);
                print(Matrix);
//System.out.println(save(0, 0, 3, Matrix));
   
    }
}

Und das Ergebnis:
Lösung:
0 2 4 5 6 7 8 9 3
0 6 1 2 3 8 9 7 5
0 1 5 3 2 9 7 4 8
0 7 6 9 8 1 2 3 4
0 8 3 1 9 4 5 6 2
0 4 9 8 1 6 3 5 7
0 5 2 6 7 3 4 1 9
0 3 8 7 4 5 6 2 1
0 9 7 4 5 2 1 8 6
 

Tobse

Top Contributor
Ich glaube hier hast du auchnoch einen Fehler:

Java:
if(i==9 && j==8)
    return true; //rechtes unteres Feld erreich

Das Sudoku ist Quadratisch - also müssen da auch beide Variablen gleich sein.

EDIT:
Und was macht dein Code, wenn das untere rechte Feld leer ist?
 

Java xyrse123

Bekanntes Mitglied
Wenn ich
Code:
 if(i==9 && j==9)
    return true;
mache, kommt Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9

Mit
Code:
 if (Matrix[i][j] != 0)  {                                                     
            solve(i+1,j,Matrix);       
        }
Gehe ich doch einfach ins nächste Feld oder nicht, wo ist da das Problem?
 

Tobse

Top Contributor
Wenn ich
Code:
 if(i==9 && j==9)
    return true;
mache, kommt Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9

Mit
Code:
 if (Matrix[i][j] != 0)  {                                                    
            solve(i+1,j,Matrix);      
        }
Gehe ich doch einfach ins nächste Feld oder nicht, wo ist da das Problem?
Du hast recht, das ist nicht das Problem. Mein Fehler.
 

Tobse

Top Contributor
Ich sehe da aber noch ein Problem. An dieser Stelle:

Java:
if (Matrix[i][j] != 0)  { // Nur Felder mit 0 sollen verändert werden                                          
             solve(i+1,j,Matrix);    //-> gehe einen Schritt weiter   
        }
       
           
            for(int value=1; value<=9; value++)    { // Alle Zahlen von 1-9 werde getestet           
                if(save(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;
            }                           
            }

Wenn das Feld nicht 0 ist, probierst du trotzdem alle Möglichkeiten aus. Und wenn eine davon passt, überschreibst du den ursprünglichen Wert. Das sieht man hier:

In der Eingabe ist die Zweite Spalte
0 6 0 7 0 0 0 8 0 in der Ausgabe ist es aber
2 6 1 7 8 4 5 3 9

Die acht in der vorletzten Zeile wurde geändert. Vielleicht kommen so auch die 0en zustande?
 

Meniskusschaden

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

Meniskusschaden

Top Contributor
Nur zur Erläuterung, falls sich jemand über mein scheinbar sinnloses Posting #10 wundert: Es steht jetzt im falschen Kontext weil Posting #9 nachträglich verändert wurde. Dort stand ursprünglich die passende Frage zu meiner Antwort.

Es würde mir besser gefallen, wenn Beiträge nicht mehr änderbar wären, sobald ein Folgeposting existiert.
 

Ähnliche Java Themen

Neue Themen


Oben