递归地查找通过迷宫 c++ 的路径

Recursively finding a path through a maze c++

本文关键字:c++ 路径 迷宫 查找 递归      更新时间:2023-10-16

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

##########          
#  ###   #
#  #     #
#        #
#    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"标记了一个解决方案。每次运行程序时,我都面临无限递归并得到错误

"在项目名称.exe中0x002396DA引发异常:0xC0000005:访问 违规写入位置 0x000A0FFC"和"未处理的异常在 项目名称.exe中的0x002396DA: 0xC0000005:访问冲突写入 位置0x000A0FFC">

添加缺少的大小写:

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

您正在跟踪已访问的跟踪,并且不使用您跟踪的'+'标记,从而导致无限递归,并且迭代未收敛。

你从来没有检查过你是否在看一个你以前已经探索过的地方。您将当前路径设置为"+",但从未在函数中实际检查过它。添加一个 if 语句,以便在当前位置标记为"+"时使函数不递归。

顺便说一下,当你回溯时,你可以通过不将路径设置回" "来大大加快你的算法,这样一旦探索了一个位置,你就永远不会回到它。这是有效的,因为你来自哪里并不重要,重要的是是否有一条从那个位置开始的路径。