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


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

  1. if (x, y outside maze) return false
  2. if (x,y-цель) return true
  3. if (x,y not open) return false
  4. отметьте x, y как часть пути решения
  5. if (FIND-PATH (North of x, y) = = true) return true
  6. if (FIND-PATH (East of x, y) = = true) return true
  7. if (FIND-PATH (South of x, y) = = true) return true
  8. if (FIND-PATH (West of x, y) = = true) return true
  9. снимите отметку x, y как часть пути решения
  10. return false
Я видел, по крайней мере, два других вопроса с этим алгоритмом, но я уверен, что проблемы не были точно такими же.
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<<"endn"; 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<<"endtwon";
    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.

Из того, что я могу сказать, метод path должен начинаться с проверки пространства непосредственно над вход, который находится вне лабиринта (возвращение ложное). После этого он должен проверить Восток (и так далее). Однако, когда я запускаю его, функция возвращает false и не может продолжить выполнение следующих инструкций if. Об этом свидетельствует тот факт, что "end" печатается, а "endtwo" (найденный после проверки Севера) - нет. Я не уверен, есть ли какая-то проблема с моей логикой рекурсии или моей реализацией рекурсии, поэтому я надеюсь на некоторое разъяснение по этому вопросу.

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

2 2

2 ответа:

Ваша первая проверка bool path(...) находит xfalse и завершает работу, а основная программа получает результат false от вызова path, печатает то, что он должен и завершает работу.

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

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