现在介绍第二种算法,使用并查集 合并生成。
简单介绍一下算法思想:首先把地图关键点的连结(墙),编号1-x*y*2,然后random shuffle
然后按照打乱后的次序,打通一些墙,用并查集检查是否要打通的两边是已经连通的就行了,
生成的例子如下:
█████████████████████
█ █ █
█████████ █ █ █ █████
█ █ █ █ █ █ █
█ █ █ ███ █████ █ █ █
█ █ █ █ █ █ █ █
█ █ ███ ███ ███ ███ █
█ █ █ █
█████ ███ █ █ ███ ███
█ █ █ █ █ █
█████ ███ ███████ █ █
█ █ █ █
█ ███ █ ███ █ █ █████
█ █ █ █ █ █ █
███ ███████ █ █ ███ █
█ █ █ █ █
█████████████████████
这种算法生成的特点是,分支数非常的多,较多短小分支,难度往往较DFS生成的简单
但效率非常高,生成1000*1000的迷宫,只要1秒(DFS生成的常数上要大一些)
但需要一个辅助的并查集数据结构,空间消耗大。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SWAP(a,b,c) {c t=a;a=b;b=t;}
int uf[9000000], Map[3000][3000]; //并查集表,迷宫地图
struct PT{int x; int y;}que[5000000]; //生成序列
int x=10,y=8,xy=0; //x,y指定要生成的大小
int findP(int& n)
{
}
int Ins(PT xy)
{
}
int main()
{
}