【问题标题】:How to create a Maze Solver in Java using Stack, Queue and Coordinate?如何使用堆栈、队列和坐标在 Java 中创建迷宫求解器?
【发布时间】:2017-10-07 06:09:34
【问题描述】:

我想使用以下通用类在 Java 中创建一个迷宫求解器:队列、堆栈和坐标(存储当前的 [x,y] 坐标)。程序读取一个包含迷宫的文本文件,将其传输到矩阵中,然后从起始位置开始搜索并移动到空白处,直到找到最终位置。

这是文本文件:

   5
   8
   ########
   E      #
   ### ####
   ### ####
   ###S####

由于程序中必须存在 Queue、Stack 和 Coordinate 泛型类,因此必须创建 4 个对象:

-Stack 类的一个对象称为“路径”和该类的一个对象
堆栈>称为“可能性”,两者都能够存储40个坐标(5 x 8 -
5行8列);

- 队列类的一个对象称为“队列”,它存储 3 个坐标并将搜索所有 4 个方向时找到的当前位置周围的空白或字符“S”排队。 (例如,在第一次搜索中,队列将是:[(1,1), , ] 因为 1,1 是从起始位置找到的第一个空白空间,然后将其添加到队列中。)

-Coordinate类的一个对象,叫做“current”,代表当前位置。

5 表示行数。 8 表示列数。字符“#”代表一堵墙,一个无法通过的地形。 char 'E' 是开始位置,char 'S' 是出口,空格(char ' ')代表可步行空间。所以程序首先将文本文件上的迷宫转移到一个上面有指定行数和列数(5和8)的矩阵中,然后找到字符'E',即起始位置,并实例化“当前”对象,将其坐标存储在其上(本例中为 (1,0))。

从那里,它顺时针搜索当前位置周围的所有 4 个方向(上、右、下和左,按此顺序)并存储在 " queue”对象并从“queue”中删除第一个坐标,将此坐标存储在“current”对象上,该对象表示当前位置。然后,在矩阵上,在“当前”对象(坐标)所代表的位置上放一个char '*',表示迈出了一步。然后,将对象“current”堆叠在“path”对象上,并将“queue”对象堆叠在对象“possibilites”上。 然后重复这些步骤,直到找到出口(char 'S'),打印矩阵并关闭程序。

最后,由于每个位置都标有“*”,因此矩阵必须如下所示: (文本文件不变)。

   5
   8
   ########
   E***   #
   ###*####
   ###*####
   ###S####

到目前为止,我已经创建了类:

队列:

public class Fila <T> {
    private Object[objfila] = null;
    private int quantidade,posinicial,posfinal;
    public void inserir(Object x) throws Exception
    {
        if(quantidade==objfila.length)
            throw new Exception("Queue is full");
        x=objfila(posfinal);
        quantidade++;
        posfinal++;
    }
    public void remover() throws Exception
    {
        if(quantidade==0){
            throw new Exception("there are no elements on the queue");
        }
        quantidade--;
        posinicial++;
    }
    public Fila(int capacidade)
    {
        this.posinicial=0;
        this.posfinal=0;
        Object objfila=new Object();
    }
}

堆栈:

public class Pilha <T> {
    private Object[] objpilha = null;
    private int topo;
    public void inserir(T x) throws Exception
    {
        if(topo==objpilha.length-1){
            throw new Exception("the stack is full.");
        }
        topo++;
        objpilha[topo]=x;
    }
    public void remover() throws Exception
    {
        if(topo==-1){
            throw new Exception("there are no elements to be removed.");
        }
        topo--;
    }
    public Pilha(int capacidade){
        objpilha=new Object[capacidade];
        topo=-1;
    }
}

和坐标:(我认为应该有一个存储坐标的x和y数组)

public class Coordenadas <T>{
    private int x;
    private int y;
}

我遇到的问题是创建这些对象并将它们插入到其他对象中,例如将找到的坐标存储在“队列”上并将“当前”对象堆叠在“路径”对象上。制作这个程序的正确方法是什么?

抱歉问题太长了。

【问题讨论】:

  • 欢迎来到 Stack Overflow!看起来你可能正在寻求家庭作业帮助。虽然我们对此本身没有任何问题,但请注意这些dos and don'ts,并相应地编辑您的问题。 (即使这不是家庭作业,也请考虑建议。)
  • @Joe C 请帮忙
  • 我认为您误解了 Stack Overflow 的含义。我们是一个问答网站。我们不是家庭作业写作服务。你不能简单地把需求和代码丢在这里,喊“救命!”,然后指望我们神奇地修复它。 这不会发生。它不仅对其他读者没有用,对你也没有用。

标签: java generics stack queue maze


【解决方案1】:

第一件事:Java API 中有一个Stack 类。 Deque 接口包含的内容比堆栈多一点。你可以开始任何实现,比如ArrayDeque:

Deque<Point> stack = new ArrayDeque<>();
stack.push(new Point(2,3));
stack.push(new Point(2,4));
Point p = stack.pop(); // (2, 4)

同样,Queue 接口具有多种实现。 ArrayDeque 就是其中之一:

Queue<Point> queue = new ArrayDeque<>();
queue.add(new Point(1, 2));
queue.add(new Point(1, 3));
Point p = queue.remove(); // (1, 2)

我使用Point 类来与这些令牌一起使用。

底线:您可以在此类之上构建您的迷宫求解器。所以你可以专注于迷宫解决。 Java 库会处理算法细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2015-05-17
    • 2011-09-22
    相关资源
    最近更新 更多