C++ 基于递归的迷宫最短路径

C++ 基于递归的迷宫最短路径,c++,recursion,depth-first-search,breadth-first-search,maze,C++,Recursion,Depth First Search,Breadth First Search,Maze,首先,我想指出的是,我之前发布过同样的问题,并没有找到正确的答案,所以很抱歉重复这个问题 注意,我需要在这里使用递归。我知道最短路径通常是使用BFS找到的,BFS不是递归的,但我需要知道如何递归地完成 我正在做一个胭脂游戏,我的一个怪物的行为就是这样。在迷宫中,如果怪物能在15步或更少的时间内到达玩家,它将使最佳移动成为可能。为了实现这一点,我编写了一个小程序,基本上模拟了我的游戏将要发生的事情。我的程序的工作方式是,它能够检查x个移动量是否能让他到达目的地。我唯一不确定的是如何迈出第一步,这样

首先,我想指出的是,我之前发布过同样的问题,并没有找到正确的答案,所以很抱歉重复这个问题

注意,我需要在这里使用递归。我知道最短路径通常是使用BFS找到的,BFS不是递归的,但我需要知道如何递归地完成

我正在做一个胭脂游戏,我的一个怪物的行为就是这样。在迷宫中,如果怪物能在15步或更少的时间内到达玩家,它将使最佳移动成为可能。为了实现这一点,我编写了一个小程序,基本上模拟了我的游戏将要发生的事情。我的程序的工作方式是,它能够检查x个移动量是否能让他到达目的地。我唯一不确定的是如何迈出第一步,这样我就可以把这些信息传递给我的怪物移动功能。这是我到目前为止写的程序

我的一个同学建议用不同的价值观来填补这个空白,并以这种方式找到道路,但我不明白他的意思。有人能告诉我怎么做吗

#include <iostream>

using namespace std;



bool pathExists(char maze[][10], int sr, int sc, int er, int ec, int distance) {
    if (maze[sr][sc] != '.')
        return false;

    if (sr == er  &&  sc == ec)
        return true;

    if(distance == 15) {
        cout<<"Cant make it in 15 steps"<<endl;
        return false;
    }
    maze[sr][sc] = '@';  // anything non-'.' will do

    if (pathExists(maze, sr-1, sc, er, ec, distance+1))
        return true;
    if (pathExists(maze, sr+1, sc, er, ec,distance+1))
        return true;
    if (pathExists(maze, sr, sc-1, er, ec, distance+1))
        return true;
    if (pathExists(maze, sr, sc+1, er, ec, distance+1))
        return true;

    return false;
}

int main() {
    char maze[10][10] = {
        { 'X','X','X','X','X','X','X','X','X','X'},
        { 'X','.','.','.','.','.','.','.','.','X'},
        { 'X','.','X','X','X','X','.','X','X','X'},
        { 'X','.','.','X','.','X','.','.','.','X'},
        { 'X','.','.','X','.','.','.','X','.','X'},
        { 'X','.','X','X','.','X','X','X','.','X'},
        { 'X','.','X','.','.','.','.','X','X','X'},
        { 'X','.','.','X','X','.','X','X','.','X'},
        { 'X','.','.','x','.','.','.','.','.','X'},
        { 'X','X','X','X','X','X','X','X','X','X'}
    };

    if (pathExists(maze, 8,8, 1,1,0))
        cout << "Solvable!" << endl;
    else
        cout << "Out of luck!" << endl;
}
#包括
使用名称空间std;
布尔路径存在(字符迷宫[][10],int-sr,int-sc,int-er,int-ec,int-distance){
如果(迷宫[sr][sc]!='。)
返回false;
如果(sr==er&&sc==ec)
返回true;
如果(距离==15){

cout您的算法运行良好。唯一缺少的是在
pathExist()中还原
,如果测试路径不成功:

    ...
    if(pathExists(maze, sr, sc + 1, er, ec, distance + 1))
        return true;

    maze[sr][sc] = '.'; //<===========  add this to restore the maze state

    return false;
    }
。。。
如果(路径存在(迷宫、sr、sc+1、er、ec、距离+1))
返回true;

maze[sr][sc]='。;//您的算法运行良好。唯一缺少的是在
pathExist()中还原
,如果测试路径不成功:

    ...
    if(pathExists(maze, sr, sc + 1, er, ec, distance + 1))
        return true;

    maze[sr][sc] = '.'; //<===========  add this to restore the maze state

    return false;
    }
。。。
如果(路径存在(迷宫、sr、sc+1、er、ec、距离+1))
返回true;
迷宫[sr][sc]='。;//我唯一不确定的部分是如何迈出第一步,这样我就可以将这些信息传递给我的怪物移动函数。这是我目前编写的程序

一种可能的方法是,如果路径存在,则从函数返回下一步的代码,否则返回0(虽然这可能不是可读代码的推荐方法,但只是提出想法)

int路径存在(字符迷宫[][10],int-sr,int-sc,int-er,int-ec,int-distance){
如果(迷宫[sr][sc]!='。)
返回0//
如果(sr==er&&sc==ec)
return 5;//我们到了
如果(距离==15){
cout我唯一不确定的部分是如何开始第一步,这样我就可以将这些信息传递给我的怪物移动函数。这是我到目前为止编写的程序

一种可能的方法是,如果路径存在,则从函数返回下一步的代码,否则返回0(虽然这可能不是可读代码的推荐方法,但只是提出想法)

int路径存在(字符迷宫[][10],int-sr,int-sc,int-er,int-ec,int-distance){
如果(迷宫[sr][sc]!='。)
返回0//
如果(sr==er&&sc==ec)
return 5;//我们到了
如果(距离==15){

我想你的意思是用填充代替感觉。我还建议删除代码中多余的空行,以便于阅读。你应该向递归函数传递一个变量迷宫(不是普通的(全局的)迷宫)您可能会将“@”解释为已访问。您对之前的问题有一个答案,因此完全不清楚您为什么再次提问,以及在何处以及为什么实际要使用递归。看起来像一个简单的检查循环就可以了。请注意,您的距离检查不应该写入,因为它写入的内容是100%错误的。当出现这种情况时是到达的,这意味着它检查的这个特定路径没有到达播放器。并不是说没有路径到达播放器。它最多可以触发1073741824次。我想你的意思是填充代替感觉。我还建议删除代码中额外的空行,以使其更易于阅读。你应该向递归函数传递一个变量迷宫(非通用(全局)选项)您可能会将“@”解释为已访问。您对之前的问题有一个答案,因此完全不清楚您为什么再次提问,以及在何处以及为什么实际要使用递归。看起来像一个简单的检查循环就可以了。请注意,您的距离检查不应该写入,因为它写入的内容是100%错误的。当出现这种情况时是到达的,这意味着它检查的特定路径没有到达玩家。不是说没有路径到达玩家。它最多可以触发1073741824次。它实际上不是无限递归的,因为最大深度检查。它只是非常非常缓慢。它正在检查…4^15=1073741824个不同的路径。哦,是的!它被限制为15!“无限”在有限堆栈的情况下有点滥用;-)使用标记技巧,第一个位置有4种可能性,所有其他位置最多有3种可能性,并且至少有一个AHA不超过2。这是4*2*3^13。因此只剩下12754584个组合:-DHis算法检查最多1073741824条路径。如果遇到墙,则检查较少。因为网格实际上是8x8,任何特定迷宫的实际检查数量将是(显著)小于最大值。@MooingDuck在组合分析中,你有没有考虑到在他的算法中发生的路径修剪?是的,在一个函数中再添加一个参数,然后用递增的值迭代函数直到极限似乎可以完成这项工作。由于最大深度,它实际上不是无限递归的检查。它只是非常非常慢。它正在检查…4^15=1073741824条不同的路径。哦,是的!它的上限是15!“无限”在有限的堆栈中有点滥用;-)使用标记技巧,第一个位置有4种可能性,所有其他位置最多有3种可能性,至少一个AHA不超过2。这是4*2*3^13。因此只剩下12754584个组合:-DHi