[CPP] Почему активная конфигурация решения «отладка» в Visual Studio может сделать ошибку? - PullRequest
0 голосов
/ 27 апреля 2020

Извините, мой основной язык не английский sh.

Я написал рекурсивную функцию для решения "проблемы с королевами".

int* Queen_Recursion(int n,int nowRow = 1, int nowColumn = 1, int* map = nullptr)
{
    if (map == nullptr)
        map = new int[n + 1]{0};
    if (nowRow > n)
    {
        std::cout << "No." << ++map[0] << " Answer:";
        for (int i = 1; i < n + 1; i++)
            std::cout << '\t' << '(' << i << ", " << map[i] << ')';
        std::cout << std::endl;
        return Queen_Recursion(n, n, map[n] + 1, map);
    }
    else if (nowColumn > n)
    {
        if (nowRow == 1)
            return map;
        map[nowRow] = 0;
        return Queen_Recursion(n, nowRow - 1, map[nowRow - 1] + 1, map);
    }
    bool CanPlace = true;
    for (int i = 1; i < nowRow; i++)
        if (map[i] == nowColumn || i - nowRow == map[i] - nowColumn || i - nowRow == nowColumn - map[i])
            CanPlace = false;
    if (CanPlace)
    {
        map[nowRow] = nowColumn;
        return Queen_Recursion(n, nowRow + 1, 1, map);
    }
    else
        return Queen_Recursion(n, nowRow, nowColumn + 1, map);
}
int main()
{
    int* temp = Queen_Recursion(8);
    delete temp;
    return 0;
}

Когда я выбираю " «Отладка», он показывает мне только 5 ответов.

enter image description here

Когда я выбираю «Отпустить», он показывает мне 92 ответа. Конечно, это правильно. enter image description here

Может кто-нибудь сказать мне причину?

Кстати, я попытался установить начальные значения «карты», и я думаю, в этой функции нет доступа к массиву вне границ.

Необработанное исключение при 0x00007FF73D68298D в 04-Some Recursion Problem.exe: 0xC00000FD: переполнение стека (параметры: 0x0000000000000001, 0x000000FA88903EC0). произошло

1 Ответ

0 голосов
/ 27 апреля 2020

Рекурсивные функции, такие как эта функция, требуют много стека. Ваша функция вызывала около 18000 раз, чтобы решить вашу проблему, и это означает, что программе необходимо сохранить стек из 18000 функций.

Вот несколько советов для вашего кода.

По мере появления ошибок ваш стек заполняется ваш рекурсивный вызов вашей функции.

Как я вижу, ваше значение не может превышать 8 (шахматы * 8*8 квадрат). Вы можете изменить все int s на uint8_t.

Вы можете определить переменные, такие как bool CanPlace вне функции, чтобы уменьшить использование стека.

Вы можете объявить uint8_t i вне вашей функции для своего счетчика l oop, и это может помочь ваша программа работает лучше

Наконец, вам нужно изменить размер стека вашего проекта. Размер стека по умолчанию в Visual Studio составляет 1 МБ. вам нужно изменить его.

Вы можете увидеть ЭТУ ссылку, чтобы увеличить размер вашего стека в visual studio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...