Почему я получаю ошибку Stackoverflow в Sudoku Solver C # - PullRequest
0 голосов
/ 07 декабря 2018

РЕДАКТИРОВАТЬ: Я на самом деле очень жаль.Моя ошибка была там

    //get unassigned position 
    unassignedPos = GetNextUnassignedValue(matrix);
    int col = unassignedPos.Item1;
    int row = unassignedPos.Item2;

строка должна быть item1 и col должна быть item2 ... Также выяснилось, что я попробовал это с судоку, который не может быть решен правильно.

IЯ новичок в C # и только начинаю углубляться в кодирование.Кто-нибудь знает, почему я продолжаю получать ошибки Stackoverflow в следующем примере кода?Я дважды проверил и переставил ограничения, они должны быть в порядке.

    class SudokuCalc
{
    (int, int) finish = (9, 9);
    (int, int) unassignedPos = (0, 0);

    //method to recursively solve the sudoku
    public bool Solve(int[,] matrix)
    {
        //if we are at the finish position return true
        if (finish.Item1 == GetNextUnassignedValue(matrix).Item1
            && finish.Item2 == GetNextUnassignedValue(matrix).Item2)
        {
            return true;
        }
        //get unassigned position 
        unassignedPos = GetNextUnassignedValue(matrix);
        int col = unassignedPos.Item1;
        int row = unassignedPos.Item2;

        //go through all possible values
        for (int value = 1; value <= 9; value++)
        {
            if (IsValid(matrix, row, col, value))
            {
                matrix[row, col] = value;
                //recursively try to solve
                if (Solve(matrix))
                {
                    return true;
                }
                // if we couldnt solve the sudoku
                // set the previous value 0 and try again
                matrix[row, col] = 0;
            }
        }
        return false;
    }

1 Ответ

0 голосов
/ 07 декабря 2018

В текущей ситуации исключение StackOverflow означает, что ваш метод Solve вызывал себя слишком много раз рекурсивно.Когда это происходит, вы можете остановить отладчик и просмотреть всю трассировку стека с множеством вложенных вызовов Solve.

В ваших условиях есть некоторый крайний случай, который вынуждает код бесконечно вызывать метод Solve.Чтобы отследить это, вы можете добавить запись в начало метода Solve и записать в матрицу диска, с которой вызывается ваша.Возможно, в какой-то момент вы получите одно и то же значение снова и снова.

...