Решатель головоломок

Итак, у меня есть игра-головоломка 3 x 3, которую я пишу, и я застрял на методе решения.

public Piece[][] solve(int r, int c) {
    if (isSolved())
        return board;
    board[r][c] = null;
    for (Piece p : pieces) {
        if (p.equals(prev[r][c])) {
            System.out.println("Hello");
            break;
        }
        if (tryInsert(p, r, c)) {
            pieces.remove(p);
            System.out.println("why");
            break;
        }
    }
    if (getPieceAt(r, c) != null)
        return solve(nextLoc(r, c).x, nextLoc(r, c).y);
    else {
        if (prev[prevLoc(r, c).x][prevLoc(r, c).y] == null)
            prev[prevLoc(r, c).x][prevLoc(r, c).y] = getPieceAt(
                    prevLoc(r, c).x, prevLoc(r, c).y);
        prev[r][c] = null;
        pieces.add(getPieceAt(prevLoc(r, c).x, prevLoc(r, c).y));
        return solve(prevLoc(r, c).x, prevLoc(r, c).y);
    }
}

Я знаю, что не предоставил много информации о головоломке, но мой алгоритм должен работать независимо от специфики. Я протестировал все вспомогательные методы, pieces — это List всех неиспользованных Piece, tryInsert пытается вставить деталь во всех возможных ориентациях, и если деталь можно вставить, так и будет. Идея prev состоит в том, чтобы предотвратить повторение программой одних и тех же комбинаций фрагментов снова и снова.

К сожалению, когда я тестирую его, я получаю StackOverflowError. Что случилось?


person abaratham    schedule 07.05.2013    source источник