我的Prim算法无法正确生成迷宫

时间:2019-11-24 01:17:15

标签: java algorithm swing graph-theory maze

我正在尝试使用Prim's算法实现随机生成的迷宫。但是该程序无法正确生成迷宫。请看看并给我一些建议

这是我迷宫的照片:

enter image description here

迷宫应如下所示: enter image description here Prim的算法:

private void Prims(){
            List<Vertex> res = new ArrayList<>();
            PriorityQueue<Vertex> priorityQueue = new PriorityQueue<>(CostComparator.compare_W());
            for (int i = 0; i < grids.length; i++){
                for(int j = 0; j < grids[i].length; j++){
                    priorityQueue.offer(grids[i][j]);
                }
            }
            grids[0][0].setG(0);
            while(!priorityQueue.isEmpty()){
                Vertex current = priorityQueue.poll();
                if(current.getPrevious() != null){
                    res.add(current);
                }
                for(Edge edge: current.getEdges()){
                    Vertex destination = edge.getDestination();
                    if(priorityQueue.contains(destination) && destination.getG() > edge.getWeight()){
                        destination.setPrevious(current);
                        destination.setG(edge.getWeight());
                    }
                }
            }
            for(int i = 0; i < res.size(); i++){
                if(i % 2 == 0){
                    res.get(i).setStyle(3);
                }
            }
            update(5);
        }

顶点类:

public class Vertex {
    private int x, y, style;
    private int f, h, g;
    private Vertex previous;
    private List<Edge> edges;
    private boolean isVisited;
}

边缘类:

public class Edge {
    private int weight;
    private Vertex destination;
    private Vertex start;
}

我也阅读了这篇文章Implementing a randomly generated maze using Prim's Algorithm,但仍然无法解决我的问题。我在该帖子中看到@Hoopje说,如果两个坐标均是偶数,则此单元格必须是一个段落。否则就是墙。但是,当我将其绘制出来时,这是不正确的,因为它看起来像是国际象棋棋盘。谢谢。

1 个答案:

答案 0 :(得分:1)

在放松期间更改顶点的权重时,Java的PriorityQueue<T>不会自动更新其内部状态。解决方案是只要更改remove and re-insert the vertex的权重即可。

这可能不是唯一的问题,但对我而言,仅查看您的代码便是最明显的问题。