知识点
①基于rank优化的并查集,用来检测两点是否相连,提高根节点查找效率
②最小生成树,通过随机权值,生成一个随机迷宫
设计思想
可以初始化一个网格地图,然后逐渐打通其中的墙,这里以5*5网格为例,“ ”表示结点,“#”表示墙;
打通前:
可以看出,这里一共有25个结点,如果要形成迷宫,需要打破24堵结点之间的墙;
创建边Edge类,存储边的起点和终点以及权值,每个结点只和自己在网格地图里上下左右相邻结点之间存在带权边,所以这里一共有5*4*2条带权边,权值随机在0~99999之间,然后存储根据Kruskal算法得到最小生成树(每个结点都与其他结点连通并且树的总权值最小)里的每一条边;根据边集合可以知道需要打通那些结点之间的墙,打通完24堵墙,迷宫生成完毕。
打通后:
具体实现
边Edge类:
主要用来存储结点与结点之间的权值,start起点,end终点,value边的权值
package 自动生成迷宫;
public class Edge{
int start;
int end;
int value;
public Edge(){
}
public Edge(int start,int end,int value){
this.start = start;
this.end = end;
this.value = value;
}
}
并查集Union类:
主要用来检测两个结点是否连通,连接两个结点,查找指定结点的根节点
package 自动生成迷宫;
public class Union {
int count;
int[] parent;//记录根节点
int[] rank;//层数
public Union(int count){
this.count = count;
parent = new int[count];
ra