我有一个使用递归找到迷宫中最长路径的分配。我还必须展示搜索路径的过程。我想我已经知道它应该如何完成,但是当涉及到代码时,我会让自己陷入停滞状态。现在我不希望代码为我完成。我只需要一些关于逻辑的指针和一些提示。 。到目前为止,这是我的递归方法。我想没有必要分享图形方法,因为递归方法是我坚持的地方。
void findPath(Point a){ // starting point
if (a == mazeEnd){
pathAdd(a);
return;
}
if (wall(a)) return;
if (visited(a)) return;
if (a == mazeStart) pathAdd(a);
length++
printPath;
findPath(new Point(a.x+1, a.y));
findPath(new Point(a.x, a.y+1));
findPath(new Point(a.x-1, a.y));
findPath(new Point(a.x, a.y-1));
}
更新:好的,谢谢大家的提示,让我进一步解释。整个电路板是一个网格。我从文件中读取墙壁,开始和引导点。我创建了一个墙壁列表,并将它们放在板上。 wall(a)检查坐标是否为wall数组。 pathAdd是一个方法,它将一个坐标添加到路径数组中。但这并不意味着在它遵守了所有路径后,路径数组将具有该板中除坐标之外的每个坐标?至少在wway我编码了它。这是我认为的主要问题。如果我可以让列表只能保持一条路径,那么我猜错了如何获得最大的路径。
答案 0 :(得分:1)
我看到了一些遗漏。
length++
以查找路径。如果你做第一个节点,然后是它周围的4个节点,那么当你的最长节点是2时,你的长度将为5。这不是好事!答案 1 :(得分:0)
如果您将一个列表传递给该方法,当您找到一条路径使其到达迷宫的末尾时,您可以将其添加到列表中。然后当递归完成时,您可以遍历列表以找到最长的路径。
答案 2 :(得分:0)
您正在限制在访问单元格/点时进一步移动。但我没有看到你在代码中标记了一个访问过的单元格/点。您可以在进入四个方向之前执行此操作。如果你不这样做,你的递归将永远不会结束。
答案 3 :(得分:0)
findPath(a)应该返回一个长度。具体来说它应该返回max(findPath(向上)|| findpath(向下)|| findPath(向左)|| findPath(向右))+ 1.如果墙(a)或被访问(a),你可以返回一个大的负数number和for mazeEnd(a)返回1.要打印路径,您需要使用pathAdd()添加返回最大长度的新Point。希望有所帮助:)