迷宫中最长的路径

时间:2013-12-13 16:41:44

标签: java algorithm recursion

我有一个使用递归找到迷宫中最长路径的分配。我还必须展示搜索路径的过程。我想我已经知道它应该如何完成,但是当涉及到代码时,我会让自己陷入停滞状态。现在我不希望代码为我完成。我只需要一些关于逻辑的指针和一些提示。 。到目前为止,这是我的递归方法。我想没有必要分享图形方法,因为递归方法是我坚持的地方。

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我编码了它。这是我认为的主要问题。如果我可以让列表只能保持一条路径,那么我猜错了如何获得最大的路径。

4 个答案:

答案 0 :(得分:1)

我看到了一些遗漏。

  1. 您永远不会将当前点添加到您的路径中 - 您只需添加开头或结尾。
  2. 您永远不会将任何积分标记为已访问过。
  3. 您检查是否有访问过的内容,但是您无法知道是否在此路径或其他路径中访问过它们。考虑有一些城墙的情况,你可以通过两条或更多条路线到达一个点:其中一条路线可能比其他路线长,但你更有可能先通过短路线到达。当它应被视为两条路线的候选者时,它最终会被忽略。
  4. 您在每次通话中触发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。希望有所帮助:)