Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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_Stack - Fatal编程技术网

Java 迷宫解算器问题(获取堆栈溢出错误)

Java 迷宫解算器问题(获取堆栈溢出错误),java,stack,Java,Stack,所以我们得到了一个迷宫,有墙(W)开放路径(O)开始点(S)和结束点(F) 我正在尝试编写一个算法,将迷宫文件转换成一个二维点阵列,形成一个网格 一旦我有了网格,我想从迷宫中的“S”字符开始,并尝试找出是否有可能穿过O到达F。(返回布尔值true/false) 我知道这个迷宫是可以解的,所以为什么我会得到一个StackOverflowerr 以下是Maze1.txt文件: WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WSO

所以我们得到了一个迷宫,有墙(W)开放路径(O)开始点(S)和结束点(F)

我正在尝试编写一个算法,将迷宫文件转换成一个二维点阵列,形成一个网格

一旦我有了网格,我想从迷宫中的“S”字符开始,并尝试找出是否有可能穿过O到达F。(返回布尔值true/false)

我知道这个迷宫是可以解的,所以为什么我会得到一个StackOverflowerr

以下是Maze1.txt文件:

WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW
WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW
WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW
WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWOOOOOOOOOOOOOOOWWW
WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOWWWWWWWWWOWWWWW
WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW
WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW
WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW
WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW
WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWOFW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
这是我的代码(新尝试):

导入java.io.File;
导入java.io.FileNotFoundException;
导入java.util.HashSet;
导入java.util.Scanner;
导入java.util.Stack;
导入java.awt.Point;
公共类MazeExplorer{
静态点开始点=新点();
静态点finishPoint=新点();
最终静态重量=12;
最终静态int mazeWidth=58;
静态字符[][]mazePoints=新字符[mazeHeight][mazeWidth];
Stack pointsNotTraversed=新堆栈();
点pt=新点();
静态HashSet previousLocations=新HashSet();
静态堆栈nextPoints=新堆栈();
公共静态void main(字符串[]args)引发FileNotFoundException{
System.out.println(“请输入迷宫的文件名”);
扫描仪控制台=新扫描仪(System.in);
文件f=新文件(console.nextLine());
扫描仪sc=新扫描仪(f);
如果(!sc.hasNextLine()){
System.out.println(“对不起,请输入一个扩展名为的文件名,它包含一个迷宫!”);
}
System.out.println(“所以,您想知道您的迷宫是否可解…”);
对于(int row=0;row对于(int j=0;j您得到堆栈溢出错误的原因如下:

public static  boolean isTraversable(Point current){
        boolean isSolvable = false;
        Stack<Point> dumbPoints = new Stack<>(); // visited
        dumbPoints.push(current); // pt is now visited
        previousLocations.add(startPoint); // starts with the 'S' point
        while(!dumbPoints.isEmpty()){
            Point test = dumbPoints.pop();
            if(previousLocations.contains(test)){
                continue; // This gets called, and while loop skips to next iteration
            }
          /* None of this code matters right now, it never gets looked at */

        } // End of while loop

        isTraversable(current);
        return isSolvable;
        }
这将重新开始我刚才所说的一切。这将永远运行,直到您的计算机内存耗尽。因此,您的错误

建议 我建议尝试另一种方法。我相信你昨天问了一个关于这个问题的问题,其他人建议将所有相邻的点推入堆栈。我认为这是一个好主意。你可以将所有相邻的O推入堆栈,然后递归调用
isTrav,而不是将当前项推入堆栈ersable
方法。这将继续,直到返回true或false,您将得到您的答案


这可能是您可以使用的更简洁的方法之一,与您已经创建的代码没有太大的差距。

开始和结束应该在页边空白处,不是吗?对不起,我刚刚编辑了我的代码,如果您想尝试和帮助,请看一下这个新版本。(我最初有很多错误)哦,不,它们不是。(别问我,这就是我们得到lol的方式)你正在用上/下/左/右方法修改同一个点对象。你需要用新坐标创建一个新的点对象。(对不起,我现在没有时间了,祝你好运)。看来您的递归调用太频繁了。请尝试改进该函数,或者使用递归以外的其他形式(或如何?)编辑:哦,在我写我的文章的时候,有很多评论。对于堆空间错误,你可以向你的JVM报告。是的,非常感谢你对一种新方法的建议。请看我的代码以获得你的建议…(参见编辑)现在,您似乎正在努力寻找x、y坐标和点对象之间的链接。也许将2D数组设置为MazeSquare对象数组会更容易。每个正方形都有一个值:O、W、S或F,并且其在数组中的位置有一个x和y值。您无法将迷宫的值更改为x以标记访问的位置。如果启用,则然后EO可以在所有4个方向上移动(可能是迷宫的交叉点)然后你会把它变成一个X,再也不允许回去访问其他方向。我写了另一个版本,我真的不想在我的结构上改变所有这些……现在怎么样了?我能做些什么吗?我得到了一个数组索引越界异常
public static  boolean isTraversable(Point current){
        boolean isSolvable = false;
        Stack<Point> dumbPoints = new Stack<>(); // visited
        dumbPoints.push(current); // pt is now visited
        previousLocations.add(startPoint); // starts with the 'S' point
        while(!dumbPoints.isEmpty()){
            Point test = dumbPoints.pop();
            if(previousLocations.contains(test)){
                continue; // This gets called, and while loop skips to next iteration
            }
          /* None of this code matters right now, it never gets looked at */

        } // End of while loop

        isTraversable(current);
        return isSolvable;
        }
isTraversable(current);