gpt4 book ai didi

java - 为什么我在 Java 中实现的随机 Prim 算法只生成了完整的网格?

转载 作者:行者123 更新时间:2023-12-02 01:56:01 27 4
gpt4 key购买 nike

我试图在维基百科上遵循这个伪代码 https://en.wikipedia.org/wiki/Maze_generation_algorithmRandomized_Prim的算法但我的代码只是生成一个完整的网格。我似乎对算法的作用缺少一些理解。有人可以帮助解释我做错了什么吗?

我查看了一些来源,但我无法理解它

public class MazeGen {
private int dimension, nodeCounter;
private Node[][] nodes;
private List<Edge> walls;

public static void main(String[] args) {
MazeGen g = new MazeGen(20);
g.generate();
g.printMaze();
}

private void generate() {
pickCell();
generateMaze();
}

private void generateMaze() {
while (!walls.isEmpty()) {
int v;
Edge wall = walls.get(ThreadLocalRandom.current().nextInt(walls.size()));
if ((!wall.nodes[0].visited && wall.nodes[1].visited)
|| (wall.nodes[0].visited && !wall.nodes[1].visited)) {
if (!wall.nodes[0].visited)
v = 0;
else
v = 1;

includeNode(wall.nodes[v]);
wall.nodes[Math.abs(v - 1)].visited = true;
}
walls.remove(wall);
}
}

private void pickCell() {
int i = ThreadLocalRandom.current().nextInt(dimension);
int j = ThreadLocalRandom.current().nextInt(dimension);

includeNode(nodes[i][j]);
}

private void includeNode(Node node) {
node.visited = true;
node.partOfMaze = true;
walls.addAll(node.edges);
}

public void printMaze() {
for (int i = 0; i < dimension; i++) {
System.out.println();
for (int j = 0; j < dimension; j++) {
if (nodes[i][j].partOfMaze) {
System.out.print(".");
} else
System.out.print("p");
}
}
}

public MazeGen(int n) {
nodes = new Node[n][n];
walls = new ArrayList<Edge>();
dimension = n;

createNodes();
connectAdjacents();
}

private void connectAdjacents() {
for (int i = 0; i < dimension; i++) {
for (int j = 0; j < dimension; j++) {
verifyConnection(i, j, i, j + 1);
verifyConnection(i, j, i + 1, j);
}
}
}

private void verifyConnection(int i, int j, int arg1, int arg2) {
if (arg1 < dimension && arg2 < dimension)
connect(i, j, arg1, arg2);
}

private void createNodes() {
for (int i = 0; i < dimension; i++) {
for (int j = 0; j < dimension; j++) {
nodes[i][j] = new Node();
}
}
}

private void connect(int row, int col, int row2, int col2) {
nodes[row][col].edges.add(new Edge(nodes[row][col], nodes[row2][col2]));
nodes[row2][col2].edges.add(new Edge(nodes[row][col], nodes[row2][col2]));
}

private class Node {
boolean visited, partOfMaze;
int number;
List<Edge> edges;

Node() {
number = nodeCounter++;
edges = new ArrayList<Edge>();
}

@Override
public String toString() {
return String.valueOf(number);
}
}

private class Edge {
Node[] nodes;

Edge(Node n, Node n2) {
nodes = new Node[2];
nodes[0] = n;
nodes[1] = n2;
}

@Override
public String toString() {
return nodes[0] + "-" + nodes[1];
}
}

最佳答案

我认为你的算法是正确的,但你没有保留正确的输出。所有节点都应该是迷宫的一部分。应该成为迷宫一部分的墙是在处理两个访问过的节点时连接它们的墙。

制作另一个输出墙数组,并在generateMaze方法中设置值。

private void generateMaze() {
while (!walls.isEmpty()) {
int v;
Edge wall = walls.get(ThreadLocalRandom.current().nextInt(walls.size()));
if ((!wall.nodes[0].visited && wall.nodes[1].visited)
|| (wall.nodes[0].visited && !wall.nodes[1].visited)) {
if (!wall.nodes[0].visited)
v = 0;
else
v = 1;

includeNode(wall.nodes[v]);
wall.nodes[Math.abs(v - 1)].visited = true;
/////////////////////////////////////
// remove this wall from the output walls
/////////////////////////////////////
} else {
////////////////////////////////
// add this wall to the output walls
////////////////////////////////
}
walls.remove(wall);
}
}

关于java - 为什么我在 Java 中实现的随机 Prim 算法只生成了完整的网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57398253/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com