Использование рекурсии для решения лабиринтов в C ++?

Я пытаюсь создать программу, которая может решать лабиринты с помощью рекурсии. Я основываю свой код на нескольких шагах, которые можно найти в Интернете, а именно:

  1. if (x, y вне лабиринта) возвращает false
  2. если (x, y — цель), верните true
  3. если (x, y не открыт) вернуть false
  4. пометить x, y как часть пути решения
  5. if (FIND-PATH (к северу от x, y) == true) возвращает true
  6. if (FIND-PATH (к востоку от x, y) == true) возвращает true
  7. if (FIND-PATH (к югу от x, y) == true) возвращает true
  8. if (FIND-PATH (West of x, y) == true) возвращает true
  9. снять отметку x, y как часть пути решения
  10. вернуть ложь

Я видел по крайней мере два других вопроса с этим алгоритмом, но я почти уверен, что проблемы не были точно такими же.

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» (найденное после проверки на север) — нет. Я не уверен, есть ли какая-либо форма проблемы с моей логикой рекурсии или моей реализацией рекурсии, поэтому я надеюсь на некоторые разъяснения по этому поводу.

Заранее спасибо!

3

Решение

Ваша первая регистрация bool path(...) находит х<0, так как x == — 1, поэтому функция возвращает false и выходит, и основная программа получает false результат звонка pathПечатает, что он должен и выходит.

Вы должны начать свои проверки с правильной позиции.

4

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

Вы начинаете с неправильной позиции, поэтому вместо этого if (path(maze, val.startX-1, val.startY)==true) {, попробуй это if (path(maze, val.startX, val.startY)==true) {, Фактическая рекурсивная часть мне кажется нормальной, при условии, что вы не против замены 'e' из лабиринта с '.',

0

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