Получение stackoverflow из моего рекурсивного решения судоку - PullRequest
0 голосов
/ 11 марта 2019
public boolean solveSudoku() {
    int row, col;
    for (Map.Entry<Pair<Integer, Integer>, List<Integer>> entry : amap.entrySet()) {      // iterate through map (amap)

        row = entry.getKey().getKey();
        col = entry.getKey().getValue();
        for (Integer num : entry.getValue()) {
            if (isSafe(row, col, num)) {
                dpuzzle[row][col] = num;

                if (solveSudoku()) { // recursive call?
                    return true;
                } else {
                    dpuzzle[row][col] = 0; // replace it 
                }
            }

        }
        return false;

    }
    return true;
}

Я реализовал решатель судоку, используя метод byGroup, чтобы исключить невозможного кандидата для каждой пустой ячейки и сохранить его на карте, ключ карты - это (i, j) сетки, иarraylist в значении Map - возможные кандидаты, а executeSudoku () должен рекурсивно вызывать себя для решения головоломки с использованием возможного кандидата из ArrayList.Однако он выплевывает:

Exception in thread "main" java.lang.StackOverflowError
at soduku.BacktrackSolver.solveSudoku(BacktrackSolver.java:113)
at soduku.BacktrackSolver.solveSudoku(BacktrackSolver.java:121) 

это строки

for (Map.Entry<Pair<Integer, Integer>, List<Integer>> entry : amap.entrySet()) {

и

if (solveSudoku()) {

Пожалуйста, просветите меня, если я сделал какую-либо ошибку, как этоМоя первая попытка использования структур данных Java.

...