所以我们有一个迷宫,有墙(W ),开放路径(O ),起点点(S)和终点点(F)。
我正在尝试编写一种算法,将迷宫文件转换为二维点阵列,形成网格。
一旦我有了网格,我想从迷宫中的“S”字符开始,并尝试找到是否有可能穿过“O”到达“f”。(返回布尔值true/false)
我知道这个迷宫是可解的,为什么我会得到一个StackOverFlowError..?
以下是Maze1.txt文件:
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WSOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOOOWOOOOOOOOOOOOOOOWOOOOOOW
WWOOOOOOOOOOOOOWWWWWWWWWWWWWOOOOOOOOOOWWWWWWWWWWWWWOOOOOOW
WWWWWWOOOOOOOOOOOOWWWWWWWOOOOOOOOOOOOWWWWWWWWWWWWWWWWOOOOW
WOOOOOOWWWWWWWWWWWWWWOOOOOOOOOOOWWWWWWWWOOOOOOOOOOOOOOOWWW
WOOOOWWWWWWWOOOOOOWWWWOOOOOOWWWWWWWWWWWOOOOWWWWWWWWWOWWWWW
WOOOWWWWWWWWWWWWOOWWWWWWWWWWWWOOOOOOOOOOOOWWWWWWWWWOOOOOWW
WOOWWWWWWWWWWWWWOOWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWWOOOW
WOWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWOOOOOOOWWWWWWWWWWWOOW
WOWWWWWWWWWWWWWOOOOOOOOOOOOOOOOOOOOOOOOOOOOWWWWWWWWWWWWOOW
WOOOOOOOOOOOOOOOOWWWWOOOOOOOOWWWWWWWOOOOOOWWWWWWWWWWWWWOFW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
这是我的代码(新尝试):
import java.io.File;
import java.io.FileNotFoundException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Stack;
import java.awt.Point;
public class MazeExplorer {
static Point startPoint = new Point();
static Point finishPoint = new Point();
final static int mazeHeight = 12;
final static int mazeWidth = 58;
static char[][] mazePoints = new char[mazeHeight][mazeWidth];
Stack<Point> pointsNotTraversed = new Stack<Point>();
Point pt = new Point();
static HashSet<Point> previousLocations = new HashSet<Point>();
static Stack<Point> nextPoints = new Stack<Point>();
public static void main(String[] args) throws FileNotFoundException{
System.out.println("Please enter the file name of your Maze");
Scanner console = new Scanner(System.in);
File f = new File(console.nextLine());
Scanner sc = new Scanner(f);
if(!sc.hasNextLine()){
System.out.println("Sorry, please enter a file name with the extension, that contains a maze!");
}
System.out.println("So, you want to know if your maze is solvable.....?");
for (int row = 0; row < mazeHeight && sc.hasNext(); row++) {
final String mazeRow = sc.next(); //Get the next row from the scanner.
mazePoints[row] = mazeRow.toCharArray(); //Convert the row into a char[].
}
//identify the finish point
for(int i = 0; i < mazeHeight; i++){
for(int j = 0; j<mazeWidth; j++){
if(mazePoints[i][j] == 'F'){
finishPoint = new Point(i, j);
}
}
}
// Identify the start point
for(int i = 0; i< mazeHeight; i++){
for(int j = 0; j < mazeWidth; j++){
if(mazePoints[i][j] == 'S'){
startPoint = new Point(i , j);
}
}
}
isTraversable(startPoint);
}
public static boolean isTraversable(Point current){
boolean isSolvable = false;
do {
mazePoints[current.x][current.y] = ' ';
if (mazePoints[current.y - 1][current.x] == 'O'){ //up dir
nextPoints.push(new Point(current.y - 1, current.x));
mazePoints[current.y - 1][current.x] = ' '; //'X' marks where you've already been
}
if(mazePoints[current.y + 1][current.x] == 'O'){ // below direction
nextPoints.push(new Point(current.y + 1, current.x));
mazePoints[current.y + 1][current.x] = ' ';
}
if(mazePoints[current.y][current.x + 1] == 'O'){ // to the right
nextPoints.push(new Point(current.y, current.x + 1));
mazePoints[current.y][current.x + 1] = ' ';
}
if(mazePoints[current.y][current.x - 1] == 'O'){ // to the left
nextPoints.push(new Point(current.y, current.x - 1));
mazePoints[current.y][current.x - 1] = ' ';
}
if(mazePoints[current.y][current.x] == 'F'){
isSolvable = true;
System.out.println("MAZE IS SOLVABLE, YAHOOOOOO!!!!!!");
}
current = nextPoints.peek();
nextPoints.pop();
isTraversable(current);
} while(!current.equals('F') && !nextPoints.isEmpty());
return isSolvable;
}
}
您收到堆栈溢出错误的原因如下:
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;
}
您将start Point
发送到isTraversable()
方法中。在方法内部,它被称为当前
。然后将当前
AKAstart Point
推送到堆栈中,然后将start Point
添加到previousLocations
集。
当循环运行是因为DumbPoint不为空(您将当前
AKA start Point放在那里)。
在 while 循环中,您进行一个新的点测试
,并将其设置为等于堆栈中的顶部项(当前,
AKA startPoint
)。
您检查< code >是否(previous locations . contains(test))为真,它确实为真。您将< code>startPoint添加到了前三行的位置集。因为它包含< code>startPoint,所以它继续进行while循环的下一次迭代。
下次进入 while 循环时,堆栈为空,因为您弹出了其中唯一的项(测试
)。因此,这次 while 循环不会执行。
然后我们跳到while循环后的下一行:
isTraversable(current);
这让我重新开始我刚才说的一切。这会一直运行,直到您的计算机内存耗尽。这就是你的错误。
建议我建议尝试不同的方法。我相信你昨天问了一个关于这个问题的问题,其他人建议将所有相邻点推入堆栈。我认为这是一个好主意。您可以将所有相邻的O推入堆栈,而不是将当前项目推入堆栈,然后递归调用isTraversable
对这些点的方法。这将持续到返回true或false,您将得到答案。
这可能是您可以使用的更简洁的方法之一,它与您已经创建的代码并不相距甚远。
问题内容: 我正在尝试使用递归编写一个迷宫求解器,似乎它尝试每个方向一次,然后停止,我不知道为什么。如果您发现问题,请告诉我。钥匙0是一个开放空间1是墙壁2是路径的一部分3是迷宫的末端 问题答案: 在过去五个小时中,您已经问过有关此迷宫递归难题的四个问题,这证明它有多复杂。这整个概念的1/0迷宫电网已吸引了我,我想出了一个类,使它成为一个 整体 变得简单许多。如果需要进行递归,那么它将对您没有用,
给定一个填充了0和1的二维字符数组,其中0代表一堵墙,1代表一条有效路径,我开发了一个名为findPath(int r,int c)的递归方法,用于在标有“x”的迷宫中找到出口。该方法接收迷宫的当前行和列,并通过N、E、S、W方向,直到找到有效路径,并用“”标记该有效路径。假设所有方向都被一堵墙挡住,那么该方法假设是回溯,直到情况不再如此,然后用“F”标记该路径,以表示坏路径。 现在我不明白为什么
问题内容: 下面给出的代码显示了运行时的Stackoverflow错误。但是,如果我使另一个类CarChange创建Car的对象,它将成功运行。我是一个初学者,请执行以下代码以了解在Java中进行向上转换的重要性。 问题答案: 一个stackoverflow通常意味着您有一个无限循环。 收到此消息的原因是因为您从testdrive方法调用驱动器,并且在该方法中再次调用drive。
主要内容:回溯算法解决迷宫问题迷宫问题指的是:在给定区域内,找到一条甚至所有从某个位置到另一个位置的移动路线。举个简单的例子,如图 1 所示,在白色区域内找到一条(甚至所有)从起点到终点的路线。 图 1 迷宫问题 迷宫问题就可以采用 回溯算法解决,即从起点开始,采用不断“回溯”的方式逐一试探所有的移动路线,最终找到可以到达终点的路线。 回溯算法解决迷宫问题 以图 1 所示的迷宫为例,回溯算法解决此问题的具体思路是: 从当前位置
不要求代码 我只想说清楚,我不希望任何人给我解决这个问题的代码,我想自己写,这样我实际上学到了一些东西。 不要求代码 好的,所以我需要创建一个类,它将采用一个txt文件,该文件具有一个由('W' = WALL,'S' = START,'O' = 可遍历空间,'F' = FINISH)组成的迷宫,并返回一个布尔真/假,说明迷宫是否可以使用堆栈和/或队列解决。 我现在处于早期阶段,所以我在想... 我
我在一门课上学习序言。我有一个练习,我需要读取一个文件,从中生成一个迷宫,获得从源到目标的路径,然后将其写入一个文件。 我读了文件,对我拥有的每个单元格断言,对连接的每两个单元格断言。 ,,,都是整数坐标,所以我知道起点和终点。 我的工作原理是,如果当前节点连接到目标,完成并返回。否则,找到当前节点所连接的节点,并用新节点调用递归