Sudoku-Algorithmus mit backtracking - java
Also ich habe das university Zuordnung zu lösen Sudoku... habe ich gelesen, Algorithmus X und Tanz Algorithmus, aber Sie wollten mir nicht helfen.
Ich brauche, um es mit backtracking. Ich hart codiert einige Indizes in den zwei-dimensionales array mit den zahlen auf den Plätzen, die von Wikipedia (so bin ich mir sicher, dass es lösbar ist).
Den code, den ich habe ist folgende:
public void solveSudoku(int row, int col)
{
//clears the temporary storage array that is use to check if there are
//dublicates on the row/col
for (int k = 0; k < 9; k++)
{
dublicates[k] = 0;
}
//checks if the index is free and changes the input number by looping
//until suitable
if (available(row, col))
{
for (int i = 1; i < 10; i++)
{
if (checkIfDublicates(i) == true)
{
board[row][col] = i;
if (row == 8)
solveSudoku(0, col + 1);
else if (col == 8)
solveSudoku(row + 1, 0);
else
solveSudoku(row, col + 1);
board[row][col] = 0;
}
}
}
//goes to the next row/col
else
{
if (row == 8)
solveSudoku(0, col + 1);
else if (col == 8)
solveSudoku(row + 1, 0);
else
solveSudoku(row, col + 1);
}
}
/**
* Checks if the spot on the certain row-col index is free of element
*
* @param row
* @param col
* @return
*/
private boolean available(int row, int col)
{
if (board[row][col] != 0)
return false;
else
return true;
}
/**
* Checks if the number given is not already used in this row/col
*
* @param numberToCheck
* @return
*/
private boolean checkIfDublicates(int numberToCheck)
{
boolean temp = true;
for (int i = 0; i < dublicates.length; i++)
{
if (numberToCheck == dublicates[i])
{
temp = false;
return false;
}
else if (dublicates[i] == 0)
{
dublicates[i] = numberToCheck;
temp = true;
return true;
}
}
return temp;
}
Ich bin immer StackOverflow auf
//goes to the next row/col
else
{
if (row == 8)
solveSudoku(0, col + 1);
else if (col == 8)
solveSudoku(row + 1, 0);
else
solveSudoku(row, col + 1);
}
was bedeutet, dass ich haben, um zu stoppen die Rekursion irgendwann, aber ich kann nicht herausfinden, wie!
Wenn Sie feststellen, andere Fehler in der solve()
- Funktion - lassen Sie es mich wissen. Weil ich bin nicht sicher, ich verstehe die "backtracking" - Ding komplett...
- byteauthor.com/2010/08/sudoku-solver hat ein schönes Beispiel dazu.
- Wiki zu 😉
- Sie sollten sich auf Ihre dublicates code. Ich sehe nicht, wie das überprüfen könnte, ob eine Zahl erlaubt ist. Sie es jederzeit zurücksetzen (mit jedem SolveSudoku nennen), damit es alles vergisst. Ich habe auch meine Zweifel, wie ein array mit 9 Elementen kann alles überprüfen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie stoppen die Rekursion zum Beispiel, wenn Sie verfolgen die aktuelle Rekursionstiefe
Zu viel code 🙂
Dies ist ungefähr die Art, wie ich dies in der Vergangenheit getan.
Habe ich es in einer einfachen Art und Weise:
Ich bin nicht sicher, warum Sie sagen, dass Dancing Links-Algorithmus X nicht sinnvoll waren.
Meinst du, dass Sie nicht in der Lage waren anzeigen Sudoku, um eine Instanz der Genaue Abdeckung problem, dass der Algorithmus, der X ist so konzipiert, lösen?
Oder dass es einen zu komplizierten Ansatz für das, was Sie brauchen??
Falls ersteres der Fall ist, möchten Sie vielleicht zu schauen: Ein Sudoku-Solver in Java Umsetzung von Knuth ' s Dancing Links-Algorithmus. Es ist ganz klar und erklärt auch die Hintergründe.
N. B. Algorithmus: X ist ein backtracking-Algorithmus, so dass, wenn das ist Ihre einzige Voraussetzung, Sie können auf jeden Fall nutzen diesen Ansatz.
Hoffe, dass dies helfen kann.