当前位置: 首页 > 知识库问答 >
问题:

使用堆栈的Java迷宫浏览器

寿高阳
2023-03-14

不要求代码

我只想说清楚,我不希望任何人给我解决这个问题的代码,我想自己写,这样我实际上学到了一些东西。

不要求代码

好的,所以我需要创建一个类,它将采用一个txt文件,该文件具有一个由('W' = WALL,'S' = START,'O' = 可遍历空间,'F' = FINISH)组成的迷宫,并返回一个布尔真/假,说明迷宫是否可以使用堆栈和/或队列解决。

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

我能不能以某种方式创建一个二维数组,为迷宫中的每个字符分配“坐标”?然后检查每一个字母,从四个方向“爆炸”检查它是否能继续这样?一旦探索了该位置,它将被添加到一个堆栈中,因此它将不再被探索。

你喜欢这个工作吗?如何创建二维阵列?

编辑:

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个答案

骆嘉石
2023-03-14

回到这个话题。如果你一开始就不知道迷宫的大小,我就不会使用2D阵列。在Java中,数组的大小是固定的,不进行昂贵的操作就无法扩展。或者,你可以将你的2D数组分配得比迷宫更大,只需填入你所拥有的。如果您知道大小,那么就阵列使用而言,您就是黄金。

我建议使用数组列表

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

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

最终情况是,要么您访问 F 并获胜,要么您的堆栈完全清空,然后您知道 F 是无法访问的(因为到那时,您将从 S 访问每个可访问的节点)。

华项明
2023-03-14

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

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

> < li >此相邻索引是父索引吗?如果是,则不添加到子代 < li >相邻索引是否在迷宫的边界内?避免ArrayIndexOutofBounds异常 < li>

此节点的值等于" 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 ...  
  }
}

类似这样的东西。开始我用你的Start制作一个新点并将其添加到队列中,然后生成它的子级获取子级并将它们添加到队列中。添加逻辑以检查是否等于“F”

 类似资料:
  • 本文向大家介绍使用栈的迷宫算法java版代码,包括了使用栈的迷宫算法java版代码的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了使用栈的迷宫算法java版,主要考察栈的使用,供大家参考,具体内容如下 主要思路如下: java代码如下: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 所以我们有一个迷宫,有墙(W ),开放路径(O ),起点点(S)和终点点(F)。 我正在尝试编写一种算法,将迷宫文件转换为二维点阵列,形成网格。 一旦我有了网格,我想从迷宫中的“S”字符开始,并尝试找到是否有可能穿过“O”到达“f”。(返回布尔值true/false) 我知道这个迷宫是可解的,为什么我会得到一个StackOverFlowError..? 以下是Maze1.txt文件: 这是我的代码

  • 所以我想做一个单一的迷宫(没有发电机)在Java,我遇到了一个路障。我有的当前代码将制作一个迷宫,并制作一个jframe,但它不会给它着色...有办法让着色工作吗?? 任何帮助都可以,谢谢!

  • 问题内容: 我在IE浏览器中遇到了一些客户端Javascript堆栈溢出问题,这是在第三方库中发生的,该库进行了一些函数调用,并且由于某些原因,它们有时仅由于IE栈限制低而在IE中制动。 然后,我编写了一个小的测试HTML,以测试某些浏览器的堆栈大小限制,并发现与运行Windows 7 OS,8Gb RAM的笔记本电脑上运行的FF 7或Chrome 14相比,IE8实际上具有较小的堆栈限制: 当值

  • 我想用递归法解迷宫。在下面的代码中,MazeCord是程序员创建的类型,它存储坐标类型位置。格式为mazecord(int x,int y)。现在编译时,我的程序会到达方法的某些部分,而忽略另一部分,因此在所有情况下都会显示“未找到路径”,并且只在LinkedList mazePath中存储开始位置。search()方法中有一个被注释掉的部分,这是我尝试的另一种方法,但我很确定它是错误的,不是这样

  • 我试图在浏览器堆栈上运行多个浏览器上的E2E测试,我参考了在量角器中的多个/并行浏览器上的E2E测试?和Internet Explorer Selenium量角器e2e测试 但每次我试着运行测试时都会犯错- 谁能告诉我什么是我做错了这里,而且我们使用gulp ti运行规范,但我的问题是它是说,甚至没有超出认证。