Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过迷宫c+递归地寻找路径+;_C++_Recursion - Fatal编程技术网

C++ 通过迷宫c+递归地寻找路径+;

C++ 通过迷宫c+递归地寻找路径+;,c++,recursion,C++,Recursion,我已经努力解决这个问题好几个小时了。我希望使用递归函数来解决由用户输入给出的迷宫。迷宫的结构如下所示: ########## # ### # # # # # # # o # # # ########## bool searchMaze(int currR, int currC) if (currR > (rows-1) || currC > (columns-1) ||

我已经努力解决这个问题好几个小时了。我希望使用递归函数来解决由用户输入给出的迷宫。迷宫的结构如下所示:

##########          
#  ###   #
#  #     #
#        #
#    o   #
#        #
##########   

        bool searchMaze(int currR, int currC)
        if (currR > (rows-1) || currC > (columns-1) || currR < 0 || currC < 0)
            return false;
        if (maze[currR][currC] == "o")
            return true;
        if (maze[currR][currC] == "#")
            return false;
        maze[currR][currC] = "+";

        if (searchMaze((currR - 1), currC) == true)
        {
            return true;
        }
        if (searchMaze(currR, (currC + 1)) == true)
        {
            return true;
        }

        if (searchMaze((currR + 1), currC) == true)
        {
            return true;
        }
        if (searchMaze(currR, (currC - 1)) == true)
        {
            return true;
        }
        maze[currR][currC] = " ";
        return false;
    }
##########
#  ###   #
#  #     #
#        #
#o#
#        #
##########   
布尔搜索迷宫(内部电流,内部电流)
如果(currR>(第1行)| | currC>(第1列)| | currR<0 | | currC<0)
返回false;
如果(迷宫[电流][电流]=“o”)
返回true;
如果(迷宫[curr][currC]==“#”)
返回false;
迷宫[currR][currC]=“+”;
if(searchMaze((currR-1),currC)=true)
{
返回true;
}
如果(搜索迷宫(currR,(currC+1))==true)
{
返回true;
}
if(searchMaze((currR+1),currC)=true)
{
返回true;
}
if(searchMaze(currR,(currC-1))==true)
{
返回true;
}
迷宫[curr][currC]=“”;
返回false;
}
这是我上面的递归方法,“o”表示解决方案。每次我运行这个程序,我都会遇到一个无限递归,并得到错误

“projectName.exe中0x002396DA处引发异常:0xC0000005:Access 写入位置0x000A0FFC“和”处未处理的异常时发生冲突 projectName.exe中的0x002396DA:0xC0000005:访问冲突写入 位置0x000A0FFC。“

添加缺少的案例:

if (maze[currR][currC] == "+")
    return false;  // Already visited
您正在跟踪已访问的轨迹,并且没有使用您跟踪的
'+'
标记,从而导致无限递归,迭代不会收敛。

添加缺少的情况:

if (maze[currR][currC] == "+")
    return false;  // Already visited

您正在跟踪已经访问过的轨迹,并且没有使用您跟踪的
“+”
标记,从而导致无限递归,并且迭代没有收敛。

您从未检查过是否正在查看您以前已经探索过的点。您将当前路径设置为“+”s,但从未在函数中实际检查它。添加if语句,使函数在当前位置标记为“+”时不递归


顺便说一句,回溯时不将路径设置回“”可以大大加快算法的速度,这样一旦探索了某个位置,就永远不会回到该位置。这是因为你从哪里来并不重要,重要的是是否有一条从该位置开始的路径。

如果你正在寻找一个你以前已经探索过的地点,你从未检查过。您将当前路径设置为“+”s,但从未在函数中实际检查它。添加if语句,使函数在当前位置标记为“+”时不递归


顺便说一句,回溯时不将路径设置回“”可以大大加快算法的速度,这样一旦探索了某个位置,就永远不会回到该位置。这之所以有效,是因为它与您来自何处无关,它只与是否有从该位置开始的路径有关。

这将是学习使用调试器的好时机。我猜您使用的是Visual Studio,在这种情况下,您只需单击某个地方的“run in debugger”(在调试器中运行)按钮,它就会运行您的程序,当程序即将崩溃时,它应该暂停该程序并指出崩溃的位置。是的,我使用的是VS 2017。不幸的是,调试器没有告诉我问题在哪里。它给出了我在问题中的错误,但我认为主要的问题是递归是无限的。我试图找出递归为何是无限的,但很难找到它。谢谢你的反馈!如果删除行
maze[currR][currC]=”,可以大大加快算法的速度这样,一旦你探索了一个职位,你就再也不会回到这个职位了。这是因为无论你是如何得到一个职位的,探索它都会得到相同的结果。这将是学习使用调试器的好时机。我猜您使用的是Visual Studio,在这种情况下,您只需单击某个地方的“run in debugger”(在调试器中运行)按钮,它就会运行您的程序,当程序即将崩溃时,它应该暂停该程序并指出崩溃的位置。是的,我使用的是VS 2017。不幸的是,调试器没有告诉我问题在哪里。它给出了我在问题中的错误,但我认为主要的问题是递归是无限的。我试图找出递归为何是无限的,但很难找到它。谢谢你的反馈!如果删除行
maze[currR][currC]=”,可以大大加快算法的速度这样,一旦你探索了一个职位,你就再也不会回到这个职位了。这是有效的,因为无论你是如何得到一个职位的,探索它几乎都会得到相同的结果。这为我解决了它,我不敢相信它如此简单!我真的很感谢你的反馈。这为我解决了它,我不敢相信它这么简单!我真的很感谢你的反馈。