So habe ich diese Universität Aufgabe, Sudoku zu lösen ... Ich las über Algorithmus X und Tanzalgorithmus, aber sie haben mir nicht geholfen.Sudoku-Algorithmus mit Backtracking - Java
Ich muss es mit Backtracking machen. Ich habe einige der Indizes in dem zweidimensionalen Array mit Zahlen an Orten, die aus Wikipedia kommen, fest programmiert (also bin ich sicher, dass es lösbar ist).
Der Code, den ich habe ist folgendes:
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 auf Stackoverflow
// 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 die Rekursion an einem gewissen Punkt zu stoppen, aber ich kann nicht verstehen es raus wie! Wenn Sie weitere Fehler in der solve()
Funktion finden - lassen Sie es mich wissen. Denn ich bin nicht sicher, ob ich die „Backtracking“ Ding ganz verstehen ...
http://www.byteauthor.com/2010/08/sudoku-solver/ hat schönes Beispiel dazu. – chAmi
[auch Wiki] (http://en.wikipedia.org/wiki/Sudoku_algorithms#Backtracking);) – sp00m
Sie sollten sich Ihren Duplikate-Code ansehen. Ich sehe nicht, wie dies überprüfen könnte, ob eine Nummer erlaubt ist. Sie setzen es immer zurück (mit jedem SolveSudoku-Aufruf), so dass es alles vergisst. Ich habe auch meine Zweifel, wie ein Array von 9 Elementen alles überprüfen kann. – Origin