我正在使用我在网上找到解决迷宫的算法。
FIND-PATH(x, y)
if (x,y outside maze) return false
if (x,y is goal) return true
if (x,y not open) return false
mark x,y as part of solution path
if (FIND-PATH(North of x,y) == true) return true
if (FIND-PATH(East of x,y) == true) return true
if (FIND-PATH(South of x,y) == true) return true
if (FIND-PATH(West of x,y) == true) return true
unmark x,y as part of solution path
return false
该算法适用于大多数迷宫。但它无法处理异常:
######
#s. #
#.## #
#.####
#...f#
######
如图所示,#是一个墙,空的空间是可用路径,s是开始,f是结束。 并且'。'虚线是运行迷宫解决程序后标记的解决方案路径。
在这种情况下,起点将路径阻塞为双向,并且在运行程序后,起点右侧有一个额外的点,无法取消标记。
我想知道是否有人可以指出为什么会出现上述算法。我应该在solve()函数中添加哪些额外的检查?谢谢!
答案 0 :(得分:1)
问题可能正在发生,因为您正在重新访问已访问过的节点。
考虑到你在功能开始时考虑的额外点。现在在你的西侧你可能错过了检查它是否是一个起点,并考虑起点不是外部迷宫和可用路径。所以现在程序再次从开始开始检查,从而给出假阳性结果。
虽然没有实际代码但很难调试。
编辑:上面正在讨论确实存在的问题
你知道起点在哪里吗?如果是这样的话
替换
if (ch =='.' || ch == '#')
return false;
与
if (ch =='.' || ch == '#' || ch=='s')
return false;