Странный порядок потока управления

Мне было поручено закодировать программу «лабиринт», которая позволит пользователю играть и решать случайный лабиринт, перемещаясь от начала до конца. До сих пор я разработал рабочий прототип, который хорошо работает для предварительно определенных лабиринтов, но организация требует, чтобы я сделал его как можно более случайным. Для этого я включил функцию ‘findpath’, которая проверяет и проверяет, можно ли решить случайный лабиринт, или иным образом вызывать ‘mazebuilder’ для создания другого случайного лабиринта. Весь код здесь: http://codepad.org/wb1OGGrZ .
Теперь во время выполнения эта функция показывает недопустимый поток управления.

int findpath(int x, int y)
{
if(fpmap[x][y]==END)    //1
{
return TRUE;
}
if(fpmap[x][y]!=PATH||fpmap[x][y]!=START)     //2
{
return FALSE;      //2a
}
min_moves++;                    //3
fpmoves++;
fpmap[x][y]=SOLUTION;
if(findpath(x,y-1))      //4
{
return TRUE;
}
if(findpath(x+1,y))
{
return TRUE;
}
if(findpath(x,y+1))
{
return TRUE;
}
if(findpath(x-1,y))
{
return TRUE;
}
min_moves--;      //5
fpmap[x][y]=PATH;
return FALSE;     //6
}

Я попытался отследить программу, и вот что делает функция при ее вызове:
1. Проверяет, если # 1.
2. Проверяет, если # 2.
3. Переходит к # 6.
Итак, почему программа не пошла на # 2a или # 3, если после # 4 или # 5?
Кажется, просто пропустить весь код и спешить на # 6. Есть ли логическая ошибка в этом или это синтаксический?
Пожалуйста, помогите мне выйти из этого.
PS: Этот код был написан для компилятора TurboC, потому что мои способности требуют от меня этого. Пожалуйста, потерпите меня 🙁

Больше информации об алгоритме, используемом в findpath: http://www.cs.bu.edu/teaching/alg/maze

-3

Решение

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

Оскорбительный код в том, что вы не проверяете границы x а также y перед рекурсивным вызовом findpath, Рекурсия может привести к x и / или y становится меньше нуля или больше scr+1,

N.B .: также в mazeloader у вас есть ненужная рекурсия, которая в конечном итоге приведет к переполнению стека: if(findpath(start.x,start.y))...else goto top; вместо else mazeloader(); или, что еще лучше, отдельный лабиринт из пользовательской игры.

0

Другие решения

В инструкциях сказано, что вы должны пометить возвращаемые позиции x (BAD_PATH), чтобы избежать повторной попытки этого подпути. Ваш код помечает их . (ДОРОЖКА).

Кроме того, у вас нет проверки за границей.

0

По вопросам рекламы [email protected]