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]=”,可以大大加快算法的速度代码>这样,一旦你探索了一个职位,你就再也不会回到这个职位了。这是有效的,因为无论你是如何得到一个职位的,探索它几乎都会得到相同的结果。这为我解决了它,我不敢相信它如此简单!我真的很感谢你的反馈。这为我解决了它,我不敢相信它这么简单!我真的很感谢你的反馈。