Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 迷宫中最长的路径_Java_Algorithm_Recursion - Fatal编程技术网

Java 迷宫中最长的路径

Java 迷宫中最长的路径,java,algorithm,recursion,Java,Algorithm,Recursion,我有一个任务,就是用递归法找出迷宫中最长的路径。我还必须展示搜索路径的过程。我想我知道应该怎么做,但当涉及到代码时,我让自己陷入了困境。现在我不想让代码为我完成。我只需要一些关于我的逻辑的指针和提示。到目前为止,这是我的递归方法。我想共享图形方法是没有意义的,因为递归方法正是我所停留的地方 void findPath(Point a){ // starting point if (a == mazeEnd){ pathAdd(a); return;

我有一个任务,就是用递归法找出迷宫中最长的路径。我还必须展示搜索路径的过程。我想我知道应该怎么做,但当涉及到代码时,我让自己陷入了困境。现在我不想让代码为我完成。我只需要一些关于我的逻辑的指针和提示。到目前为止,这是我的递归方法。我想共享图形方法是没有意义的,因为递归方法正是我所停留的地方

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)); 

}

更新:好的,谢谢大家的提示,让我进一步解释。整个电路板是一个网格。我从一个文件中读取墙的起点和终点。我为墙壁创建一个列表,并将它们放在黑板上。墙(a)检查坐标是否为墙阵列。pathAdd是一种将坐标添加到路径数组的方法。但这难道不意味着在完成所有路径后,路径数组将拥有该板中的所有坐标,除了墙以外的坐标吗?至少在wway我已经把它编码了。我想这是我的主要问题。如果我能让列表只包含一条路径,我想我会想出如何从中获取最大的路径。

如果您将列表传递到方法中,当您找到一条路径使其到达迷宫的末端时,您可以将其添加到列表中。然后当递归结束时,您可以遍历列表以找到最长路径。

我看到了一些遗漏

  • 您从未将当前点添加到路径-您只添加起点或终点
  • 您从未将任何点标记为已访问
  • 您检查是否访问了对象,但无法知道这些对象是在此路径中访问的还是其他路径中访问的。考虑有一些岛屿的情形,你可以通过两条或更多条路线到达一点:这些路线中的一条可能比其他路线长,但是你更可能首先通过短路线到达它。当它应该被视为两条路线的候选者时,它最终将被忽略
  • 每次调用查找路径时都会触发
    length++
    。如果你做第一个节点,然后是它周围的4个节点,当你的最长节点是2时,你的长度将是5。那不好
    访问单元/点时,您将限制进一步移动。但我没有看到您在代码中将单元格/点标记为已访问。您可以在进入四个方向之前执行此操作。如果不这样做,递归将永远不会结束。

    findPath(a)应该返回一个长度。具体来说,它应该返回max(findPath(向上)| | findPath(向下)| | findPath(左)| | findPath(右))+1。如果是wall(a)或Visited(a),则可以返回一个较大的负数,对于mazeEnd(a),则返回1。要打印路径,需要使用pathAdd()添加返回最大长度的新点。希望有帮助:)

    墙是点还是边?你能有两个点都是开放的,但它们之间有一堵墙吗?或者墙只是一个你不能进入的点。迷宫是如何定义的?
    wall(a)
    visted(a)
    方法做什么?既然你知道应该怎么做,你能描述一下这个算法吗。这将使我们更容易帮助您编写算法有趣的Elliott-最长路径在图论领域有明确定义的含义。不需要在标题中添加主标记。