这是我使用的 DisjointSet 类:
public class DisjointSet{
public DisjointSet(int size){
s = new int[size];
for(int i = 0; i < size; ++i){
s[i] = -1;
}
}
public void union(int el1, int el2){
int root1 = find(el1);
int root2 = find(el2);
if(root1 == root2){
return;
}
if(s[root2] < s[root1]){
s[root1] = root2;
}
else{
if(s[root1] == s[root2]){
--s[root1];
}
s[root2] = root1;
}
}
public int find(int x){
if(s[x] < 0){
return x;
}
else{
s[x] = find(s[x]);
return s[x];
}
}
private int[] s;
}
这是我的迷宫课:
public class Maze
{
public Vector<Wall> maze;
public Vector<Room> graph;
public Vector<Integer> path;
public int LASTROOM;
public int height;
public int width;
public Random generator;
public DisjointSet ds;
public int dsSize;
public Maze(int w, int h, int seed)
{
width = w;
height = h;
dsSize = width * height;
LASTROOM = dsSize-1;
// Maze initialization with all walls
maze = new Vector<Wall>();
for(int i = 0; i < height; ++i)
{
for(int j = 0; j < width; ++j)
{
if(i > 0)
maze.add(new Wall(j+i*height, j+(i-1)*height));
if(j > 0)
maze.add(new Wall(j+i*height, j-1+i*height));
}
}
// Creation of the graph topology of the maze
graph = new Vector<Room>();
for(int i = 0; i < dsSize; ++i)
graph.add(new Room(i));
// Sort the walls of random way
generator = new Random(seed);
for(int i = 0; i < maze.size(); ++i)
{
//TODO
}
// Initialization of related structures
ds = new DisjointSet(dsSize);
path = new Vector<Integer>();
}
public void generate()
{
//TODO
}
public void solve()
{
//TODO
}
}
很长一段时间以来,我一直在寻找一种方法来实现generate()和solve()以及对迷宫墙壁的随机排序,我似乎无法在互联网上找到任何算法或实现来做到这一点.
如果由墙连接的两个部分(房间)不在同一个集合中,则generate()应该穿过迷宫变量中的置换墙并销毁它。该方法还应该在房间图中添加一条边(每个房间都有一个名为路径的邻接列表,并且Room类有一个变量id来标识每个图的顶点)。
solve()应该解决迷宫路径并生成Maze类的向量,其中包含到达出口的房间顺序。第一个房间位于 0 处,最后一个房间位于LASTROOM 处。
注意:迷宫和房间的构造函数如下:
public Wall(int r1, int r2)
{
room1 = r1;
room2 = r2;
}
public Room(int i)
{
id = i;
distance = -1;
paths = new Vector<Integer>();
}
如果有人愿意建议一个可以在 Java 中运行的实现,我将不胜感激,谢谢。