这个算法成功地为我提供了一条通过迷宫的路径.迷宫是一个二维二进制矩阵,目标位置是‘9’.

该算法的工作原理是遍历到达‘9’(基本大小写)的‘0’路径,并递归地将以前的位置添加到我的路径数组中.

我观察到,删除顶部的边界检测线会产生索引越界错误.但我很确定,当小路碰到一堵墙时,这个算法就会崩溃.

它在200x200或更小的矩阵上也能顺利工作,在250x250的情况下大约有50%的时间可以正常工作. (如下面的100宽度图所示.)

public static boolean searchPath(int[][]maze, int x, int y, ArrayList<Integer> path){
        if(x<0 || x>=maze[1].length || y<0 || y>=maze.length) return false;
        if(maze[y][x] == 9){
            path.add(x);
            path.add(y);
            return true;
        }
        if(maze[y][x] == 0){
            maze[y][x] = 2;

            int dx = -1;
            int dy = 0;
            if(searchPath(maze,  x+dx, y+dy, path)){
                path.add(x);
                path.add(y);
                return true;
            }
            dx = 1;
            dy = 0;
            if(searchPath(maze,  x+dx, y+dy, path)){
                path.add(x);
                path.add(y);
                return true;
            }
            dx = 0;
            dy = -1;
            if(searchPath(maze,  x+dx, y+dy, path)){
                path.add(x);
                path.add(y);
                return true;
            }
            dx = 0;
            dy = 1;
            if(searchPath(maze,  x+dx, y+dy, path)){
                path.add(x);
                path.add(y);
                return true;
            }
        }
        return false;
    }

enter image description here

enter image description here

推荐答案

堆栈空间是有限的,因此只有在您知道递归算法会使用合理数量的堆栈空间时,才应该编写递归算法.

使用递归DFS找到走出NxM迷宫的方法会使用O(N*M)堆栈空间--这是不合理的.

您可以使用单独的堆栈数据 struct 编写DFS,但实际上您应该将BFS与队列一起使用.它稍微简单一点,而且你会得到最短的路径.

Java相关问答推荐

基于仅存在于父级中的字段查询子文档?

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

取消按钮,但没有任何操作方法引发和异常

';com.itextpdf.ext.html.WebColors已弃用

由于我在Main方法中关闭了 scanner ,但在该方法中创建了一个新的 scanner ,因此出现了错误

无法了解Java线程所消耗的时间

在Spring Boot中使用哪个Java类来存储创建时间戳?

通过移动一个类解决了潜在的StubbingProblem.它怎麽工作?

如何在Application.yaml中连接字符串?

在Frege中,我如何将一个字符串安全地转换为一个可能的Int?

Java Telnet客户端重复的IAC符号

无法播放音频:从资源加载库GStreamer-Lite失败

如何在列表(链表)中插入一个新 node (作为prelast)

try 使用类来包含JSON响应

STREAMS减少部分结果的问题

如何在右击时 Select 新行?

在单例类上获取Java锁,了解原因

无泄漏函数的Java DRY

在不带instanceof或switch的java中记录模式

如何在 WebSphere Application Server 内的托管线程上运行 BatchEE 作业(job)?