Vì vậy, tôi có nhiệm vụ đại học này để giải quyết Sudoku ... Tôi đọc về thuật toán X và thuật toán Khiêu vũ, nhưng họ đã không giúp tôi.Thuật toán Sudoku với backtracking - java
Tôi cần thực hiện việc này với tính năng quay lại. Tôi đã mã hóa cứng một số chỉ mục trong mảng hai chiều với các số ở các vị trí được cung cấp từ Wikipedia (vì vậy tôi chắc chắn rằng nó có thể giải được).
Mã tôi nhận được như sau:
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;
}
Tôi nhận StackOverflow trên
// 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);
}
có nghĩa là tôi phải ngăn chặn sự đệ quy tại một số điểm, nhưng tôi không thể hình nó ra làm thế nào! Nếu bạn tìm thấy bất kỳ sai lầm nào khác trong hàm solve()
- hãy cho tôi biết. Bởi vì tôi không chắc chắn tôi hiểu được "quay lui" điều hoàn toàn ...
http://www.byteauthor.com/2010/08/sudoku-solver/ có ví dụ hay về điều này. – chAmi
[Wiki too] (http://en.wikipedia.org/wiki/Sudoku_algorithms#Backtracking);) – sp00m
Bạn nên nhìn vào mã số cộng hòa của mình. Tôi không thấy làm thế nào điều này có thể kiểm tra nếu một số được cho phép. Bạn luôn đặt lại (với mỗi cuộc gọi SolveSudoku) để nó quên mọi thứ. Tôi cũng có những nghi ngờ của tôi về cách một mảng của 9 yếu tố có thể kiểm tra tất cả mọi thứ – Origin