使用堆栈的Java Maze Explorer

时间:2014-03-04 18:24:06

标签: java maze stack

不要求代码

我只是想说清楚我不希望任何人给我代码来解决这个问题,我想自己写一下,所以我真的学到了什么。

不要求代码

好的,所以我需要创建一个类,它将采用一个包含迷宫的txt文件('W'= WALL,'S'= START,'O'= TRAVERSABLE SPACE,'F'= FINISH)并使用堆栈和/或队列返回一个布尔值true / false,判断迷宫是否可以解决。

我现在处于早期阶段,所以我在想这里......

我可以以某种方式创建一个二维数组,为迷宫中的每个角色分配“坐标”吗?然后只需浏览每一个字母并“爆炸”以检查所有四个方向是否可以继续这样做?一旦探索了该位置,它将被添加到堆栈中,因此不再进行探索。

这样的事情会起作用吗?如何创建2D阵列?

编辑:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Stack;
import java.awt.Point;


public class MazeExplorer {
    public static int x;
    public static int y;

    final int mazeHeight = 12;
    final int mazeWidth = 58;
    public static char[][] mazeLocationPoints = new char[12][58];






    public static void main(String[] args) throws FileNotFoundException{

        File f = new File("Maze1.txt");
        Scanner sc = new Scanner(f);
        String mazeString = new Scanner( f ).useDelimiter("\\A").next();

        Stack<Point> points = new Stack<>();
        while(sc.hasNextLine()){
            mazeLocationPoints[][] = sc.nextLine().toCharArray();
            points.push(mazeLocations);


        }

    }

}

2 个答案:

答案 0 :(得分:0)

所以回过头来看看。如果您不知道迷宫的大小,我就不会使用2D阵列。数组在Java中是固定大小的,如果不进行昂贵的操作就无法扩展。或者,您可以将2D阵列分配为比迷宫更大,然后填写您拥有的内容。如果您知道大小,那么就数组使用而言,您就是黄金。

我建议使用ArrayList&gt; (或者使用String代替Character,如果这对你来说更容易)来维持你的迷宫。通过这种方式,您可以非常轻松地构建迷宫,而无需了解开始时的尺寸,并且可以轻松打印它。

对于迷宫遍历,您需要记录起点然后搜索终点。有几种算法选择(有些比其他算法要好得多)但如果你的老师想要你使用堆栈,他可能希望你使用深度优先搜索,因为这是基于标准堆栈的搜索算法。维基百科有一篇关于如何执行的文章。

您还需要使用地图来维护已搜索过的迷宫中的位置。或者你可以修改迷宫本身并在你访问O之后填写W,但这可能会有点棘手,因为它引入了一些边缘情况需要担心。

最后一种情况是您访问F并赢得或您的堆栈完全清空,然后您知道F无法访问(因为到那时您将访问S中的每个可达节点)。

答案 1 :(得分:0)

您应该将每个Point视为一个跟踪其祖先和孩子的节点。如果子节点不是当前节点父节点并且其值=='O',则将子节点添加到列表中。首先将您的起始节点添加到队列中。弹出它并标记它访问。将其所有子项添加到队列中弹出它们并标记它们已访问。重复此过程,直到您的Queue为空或找到值为“F”的节点

可以通过考虑邻近指数并评估三件事来找到儿童:

  1. 这个邻近的索引是父母吗?如果是,请不要添加到孩子
  2. 相邻指数是否在迷宫的范围内?避免ArrayIndexOutofBounds异常
  3. 此节点的值是否等于“O”或“F”。如果'O'添加到子列表并排队。如果'F'你就完蛋了。

    public class Point {
      int i;
      int j;
      char value;
      Point parent;
      ArrayList<Point> children;
    
      public static final maze[][];
    
      public Point(int i, int j, char val) {
        this.i = i;
        this.j = j;
        this.val = val
        parent = null;
        children = new ArrayList<Point>();
      }
    
      public void generateChildren() {
        if (i + 1 <= mazeHeight && j + 1 <= mazeWidth) {
          if (maze[i+1][j+1] == 'O') {
            if (!maze[i+1][j+1].equals[this.parent]) {
              Point child = new Child(i+1, j+1, 'O');
              child.parent = this;
              children.add(child);
            }
          }
        }
        // ADD LOGIC FOR OTHER CASES i -1 j -1 etc ...  
      }
    }
    
  4. 像这样的东西。开始我用你的Start创建一个新的Point并将它添加到队列然后生成它的子节点让孩子们回来并将它们添加到队列中。添加逻辑以检查是否等于'F'