сбой после некоторой итерации пользовательского дерева С++

Я пишу простой решатель скользящих плиток (3x3). Конечно, это не лучший подход, я просто генерирую всю возможную конфигурацию, но я не знаю, почему во время выполнения мой компьютер зависает, и я должен перезагружаться вручную. это основной цикл

while(!(tree->s==final))
{ 
    //copy it in tree   

    expand_node(tree);
    //check if in open then add if not
    it++;
}      
print_s(tree->s);

PS: я собрал все с

g++ -Wall -Wextra -std=c++11 main.cpp

person Community    schedule 15.10.2018    source источник
comment
Пожалуйста, включите соответствующий код в текст вашего вопроса. Эти ссылки сгниют, и вопрос не будет иметь смысла в будущем для любых пользователей, которые зайдут на него. Кроме того, реклама pastebin огромна и излишне отвлекает.   -  person alter igel    schedule 15.10.2018
comment
Предоставьте минимально воспроизводимый пример. ~400 LOC, связанных на pastebin, определенно не являются минимально воспроизводимым примером.   -  person Swordfish    schedule 15.10.2018


Ответы (1)


Внутри вашего диапазона на основе циклов, которые вы добавляете в список:

for(auto v : open)
    if(!(v.s==tree->childs[i].s))
        open.push_back(tree->childs[i]);

Это приведет к тому, что список будет расти и запускать другую итерацию, пока вся память на вашем компьютере не будет исчерпана. Ваша машина, вероятно, не зависает, просто становится очень медленной, пока ваша ОС подкачивает память на диск.

person Alan Birtles    schedule 15.10.2018
comment
Моя идея заключалась в том, чтобы сгенерировать все возможные конфигурации, пока я не найду решение. Этот подход неверен? Что может быть лучшим подходом? - person ; 15.10.2018
comment
@dario Без минимального воспроизводимого примера трудно сказать, что вам нужно самостоятельно отлаживать свой код, но он выглядит я, вероятно, закончу бесконечным циклом - person Alan Birtles; 15.10.2018
comment
В этом вопросе говорится, что добавление элементов для открытия во время итерации является неопределенным поведением: in-a-range-based-for-loop-o" title="законно ли добавлять элементы в предварительно выделенный вектор в диапазоне на основе цикла for o">stackoverflow.com/questions/35468207/ - person drescherjm; 15.10.2018
comment
@drescherjm, который применяется только к вектору, поведение определяется с помощью std::list, хотя оно меняется в зависимости от того, какой стандарт С++ вы используете en.cppreference.com/w/cpp/language/range-for. С++ 17 исправит бесконечный цикл - person Alan Birtles; 16.10.2018