2013-03-21 18 views
7

Ich habe ein Problem mit meiner Sudoku-Methode zu lösen. Das Programm funktioniert so; das Board ist leer, wenn es gestartet wird, die Benutzer fügen ein paar Zahlen auf dem Board hinzu und dann versucht das Programm durch Drücken einer Solve-Taste das Problem zu lösen. Alles funktioniert gut, außer wenn ich dieselbe Nummer in die gleiche Zeile stecke. Also, wenn der Benutzer 1,1,0,0 ... 0 hinzufügt. In dem Puzzle kann es nicht lösen, weil seine zwei 1 nebeneinander sind und wird immer weiter versuchen, eine Sulotion zu finden, obwohl es ein unlösbar ist Puzzle. Wenn sie jedoch alle 0 (leer) wären, würde sie es sofort lösen, so als ob Id 1 und 2 in die obere linke Ecke setzen würde. Wenn ich nur ein paar Zufallszahl setzen würde darin als unlösbares erkennt (oder wird es lösen, wenn es ein gültiges Puzzle ist)Sudoku lösen Methode

Ich denke, um die Linien zu sagen, wenn theNumber == (row, col) equals thenNumber == (row+1, col), soll es return false, weil es eine ist doppelte Nummer.

Dies ist der Code, den ich in der Solve-Methode hinzugefügt habe, offensichtlich ohne Erfolg.

if ((puzzle.getNum(row, col) == a) == (puzzle.getNum(row + 1, col) == a)) { 
    return false; 
} 

Hilfe wird sehr geschätzt

+3

Haben Sie versucht, eine Art von Validierung hinzuzufügen, bevor Sie versuchen, "zu lösen"? Wenn du sofort weißt, dass das Rätsel unlösbar ist (zwei 1er in einer Reihe), dann willst du keine Endlosschleife versuchen zu lösen. – Walls

+0

@Walls Ja, ich habe versucht, eine Art von Validierungsmethode, aber ich konnte es nicht zum Laufen bringen. Dies ist mein neuer Versuch "zu validieren". Und dazu brauche ich Hilfe. – Rob

+1

Ändern von Variablennamen von a, i, j würde dies viel lesbarer machen. Oder einige Kommentare würden sehr geschätzt werden. Ich versuche, aussagekräftige Variablennamen zu haben, und das macht die Fehlersuche viel einfacher. –

Antwort

4

Validate das Rätsel wie folgt aus:

  1. Erstellen Sie eine boolean-Array aus 9 Elementen.
  2. Schleife durch jede Zeile, Spalte und 9x9-Box.
    • Wenn Sie eine Zahl lesen, setzen Sie den entsprechenden Wert im Array auf True.
    • Wenn es schon wahr ist, wirf einen Fehler (unmögliche Rätsel).
    • Nach dem Lesen einer Zeile, Spalte oder 9x9 Box das Boolean Array zurückgesetzt.
  3. Dann, wenn die Validierung erfolgreich war, rufen Sie die Lösungsmethode auf.

EDIT: Quellcode

public boolean checkPuzzle() { 
    boolean[] nums = new boolean[9]; 
    for (int row = 0; row < panel.puzzleSize; row++) { 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      if (nums[puzzle[row][cell]]) return false; 
      nums[puzzle[row][cell]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    for (int col = 0; col < panel.puzzleSize; col++) { 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      if (nums[puzzle[cell][col]]) return false; 
      nums[puzzle[cell][col]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    for (int square = 0; square < panel.puzzleSize; square++) { 
     int squareCol = panel.squareSize * (square % panel.squareSize); 
     int squareRow = panel.squareSize * Math.floor(square/panel.squareSize); 
     for (int cell = 0; cell < panel.puzzleSize; cell++) { 
      int col = cell % panel.squareSize; 
      int row = Math.floor(cell/panel.squareSize); 
      if (nums[puzzle[squareCol + col][squareRow + row]]) return false; 
      nums[puzzle[squareCol + col][squareRow + row]] = true; 
     } 
     nums = new boolean[9]; 
    } 
    return true; 
} 

Haben Sie nicht zu viel Zeit zu testen, aber es könnte funktionieren (?). Die namen der row/col Variablen könnten falsch sein, weil ich keine Zeit hatte, das in deinem Code zu finden, aber es sollte nicht wichtig sein, ob es funktioniert oder nicht.

+0

Wie würde dieser Code in meiner Methode aussehen? Da es mir schwer fällt, eine Art von Validierungsmethode zu implementieren. Ich verstehe, dass ich meine Reihen, Spalten durchlaufen muss, aber ich bin nicht wirklich sicher, wie man Schritt Nr. 2 macht. – Rob

+0

Sie müssen dies tun, bevor Sie die Solving-Methode aufrufen (die wiederholt 'check()' aufruft. Ich schlage vor, dass Sie drei Schleifen verwenden, um Zeilen, Spalten und 9x9 Blöcke zu durchlaufen. Dann implementieren sie Code, der das boolesche Array aktualisiert und Ich kann keinen Code angeben, da ich nicht weiß, wie Ihr Lösungscode aussieht, außer für die 'check()' Methode. Sie sollten es wie folgt machen: if (boolean_array [found_number]) {/ * fail * /} boolean_array [found_number] = true; '. – Pietu1998

+0

Ich werde weitermachen und Ihren Vorschlag versuchen, in der Zwischenzeit habe ich meinen Hauptbeitrag bearbeitet und meine Quelle hinzugefügt. – Rob