Я пытаюсь создать программу, которая может решать лабиринты с помощью рекурсии. Я основываю свой код на нескольких шагах, которые можно найти в Интернете, а именно:
Я видел по крайней мере два других вопроса с этим алгоритмом, но я почти уверен, что проблемы не были точно такими же.
bool path (string maze[], int x, int y){
values val;
bool check;
//for (int k=0; k<val.xDim; k++) cout<<maze[k]<<endl;
cout<<x<<":"<<y<<endl;
if (x>val.xDim || y>val.yDim || x<0 || y<0) {cout<<"end\n"; return false; }
if (maze[x][y]=='x') return true; //If exit is reached
if (maze[x][y]=='%' || maze[x][y]=='+') return false; //If space is filled
maze[x][y]='+';
if (path(maze, x-1, y)==true) return true;
cout<<"endtwo\n";
if (check=path(maze, x, y+1)==true) return true;
if (path(maze, x+1, y)==true) return true;
if (path(maze, x, y-1)==true) return true;
maze[x][y]='.';
return false;
}
int main(){
if (path(maze, val.startX-1, val.startY)==true) {
for (int k=0; k<val.xDim; k++) cout<<maze[k]<<endl;
} else cout<<"No solution found.\n";
}
Пример лабиринта (где e — вход, а x — выход):
%e%%%%%%%%%
%...%.%...%
%.%.%.%.%%%
%.%.......%
%.%%%%.%%.%
%.%.....%.%
%%%%%%%%%x%
Выход:
-1:1
end
No solution found.
Из того, что я могу сказать, метод пути должен начинаться с проверки пространства непосредственно над входом, который находится вне лабиринта (возвращая false). После этого следует проверить восток (и так далее). Однако, когда я запускаю его, функция возвращает false и не может перейти к следующим операторам if. Это подтверждается тем фактом, что «end» печатается, а «endtwo» (найденное после проверки на север) — нет. Я не уверен, есть ли какая-либо форма проблемы с моей логикой рекурсии или моей реализацией рекурсии, поэтому я надеюсь на некоторые разъяснения по этому поводу.
Заранее спасибо!
Ваша первая регистрация bool path(...)
находит х<0, так как x == — 1, поэтому функция возвращает false
и выходит, и основная программа получает false
результат звонка path
Печатает, что он должен и выходит.
Вы должны начать свои проверки с правильной позиции.
Вы начинаете с неправильной позиции, поэтому вместо этого if (path(maze, val.startX-1, val.startY)==true) {
, попробуй это if (path(maze, val.startX, val.startY)==true) {
, Фактическая рекурсивная часть мне кажется нормальной, при условии, что вы не против замены 'e'
из лабиринта с '.'
,