如何使用Stack,Queue和Coordinate在Java中创建Maze Solver?

时间:2017-05-09 04:34:35

标签: java generics stack queue maze

我想使用以下泛型类在Java中创建一个Maze Solver:Queue,Stack和Coordinate(存储当前的[x,y]坐标)。该程序读取包含迷宫的文本文件,将其传输到矩阵,并从起始位置搜索并移动到空白空间,直到找到最终位置。

这是文本文件:

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

因为程序中必须存在Queue,Stack和Coordinate泛型类,所以必须创建4个对象:

- Stack<类的一个对象坐标>叫"路径"和班级的一个对象 堆<队列<坐标> >称为"可能性",两者都能够存储40个坐标(5 x 8 - 5行8列);

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

- Coordinate类的一个名为" current"的对象,它代表当前位置。

5表示行数。 8表示列数。 char'#'代表一堵墙,一块不可逾越的地形。 char' E'是开始的位置,char' S'是出口和空格(char'')表示可步行的空格。因此程序首先将文本文件上的迷宫转移到具有指定行数和列数的矩阵(5和8),然后找到char' E',这是起始位置,实例化"当前"对象,将其坐标存储在其上(在案例中为(1,0))。

从那里开始,它按时钟顺序搜索当前位置周围的所有4个方向(按此顺序向上,向右,向下和向左)并存储空白空间的坐标(或字符' S' )发现在"队列"对象并从"队列"中删除第一个坐标,将此坐标存储在"当前" object,表示当前位置。然后,在矩阵上,放一个字母' *'在"当前"所代表的位置上对象(坐标),表示已采取步骤。然后,堆叠对象" current"在"路径"对象并堆叠"队列"对象" 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;
}

我遇到的问题是创建这些对象并将它们插入到其他对象中,就像在&#34;队列中存储找到的坐标一样。并堆叠&#34;当前&#34;对象&#34;路径&#34;宾语。制作这个程序的正确方法是什么?

很抱歉这个问题很长。

1 个答案:

答案 0 :(得分:0)

首先要做的是:Java API中有一个Stack类。 Deque接口包含的内容比Stack多一点。您可以开始任何实施,例如ArrayDeque

ArrayDeque

同样,有许多实现的Queue接口。 Queue<Point> queue = new ArrayDeque<>(); queue.add(new Point(1, 2)); queue.add(new Point(1, 3)); Point p = queue.remove(); // (1, 2) 就是其中之一:

{{1}}

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

结论:你可以在这个类的顶部构建你的迷宫求解器。所以你可以专注于迷宫解决。 java库将处理算法细节。