: h( B/ e$ D5 r& l# \6 t 8 T1 f7 i' H( R# H画迷宫 ' t0 p2 v- n% \8 H5 P: |. }2 c) j. ? ~# Q6 d4 _9 m
随机迷宫怎么生成?怎么搞?一脸懵逼。! J3 Y% U; `" O
5 ~' K, Z0 m) p) F d因为我们想要迷宫,那么就需要这个迷宫出口和入口有连通路径,你可能压根不知道迷宫改怎么生成,用的什么算法。小声BB:用并查集(不相交集合)。3 c. z0 x9 E( H0 o8 S: P
迷宫和不相交集合有什么联系呢?(规则) 0 _; p$ p: I, _; V' H 4 G$ C( } e1 a ~- u B5 D0 q之前笔者在前面数据结构与算法系列中曾经介绍过并查集(不相交集合),它的主要功能是森林的合并,不联通的通过并查集能够快速将两个森林合并,并且能够快速查询两个节点是否在同一个森林中!$ b# y5 A( n3 q; Q
而我们的随机迷宫:在每个方格都不联通的情况下,是一个棋盘方格,这也是它的初始状态。而这个节点可以跟邻居可能相连,也可能不相连。我们可以通过并查集实现。5 `9 g: B* i& N$ y
R: b) X% E) A2 U
具体思路为:(主要理解并查集)8 Y8 w" I/ B. y% E
, N, z4 D, C( q k: H1:定义好不想交集合的基本类和方法(search,union等)0 m$ B! }- _& y: r
2:数组初始化,每一个数组元素都是一个集合,值为-13 G: r& C% g) G7 B! Y
3:随机查找一个格子(一维数据要转换成二维,有点麻烦),在随机找一面墙(也就是找这个格子的上下左右),还要判断找的格子出没出界。 / D, ^/ B) h6 w9 e6 W# r( h3 e具体在格子中找个随机数m——>随机数m在二维中的位置[m/长,m%长]——>这个二维的上下左右随机找一个位置p[m/长+1,m%长]或[m/长-1,m%长]或[m/长,m%长+1]或[m/长,m%长-1]——>判断是否越界9 ] q5 V- d d7 r
4:判断两个格子(一维数组编号)是否在一个集合(并查集查找)。如果在,则重新找,如果不在,那么把墙挖去; M9 U$ \! Z$ C z% W3 v8 N
5:把墙挖去有点繁琐,需要考虑奇偶判断它那种墙(上下还是左右,还要考虑位置),然后擦掉。(根据数组转换成真实距离)。具体为找一个节点,根据位置关系找到一维数组的号位用并查集判断是否在一个集合中。' g5 j2 p* h: B! m
6:最终得到一个完整的迷宫。直到第一个(1,1)和(n,n)联通停止。虽然采用随机数找墙,但是效果并不是特别差。其中要搞清一维二维数组的关系。一维是真实数据,并查集操作。二维是位置。要搞懂转化! 1 R0 S* W$ ^5 E) {! e: s9 ^0 O注意:避免混淆,搞清数组的地址和逻辑矩阵位置。数组从0开始的,逻辑上你自己判断。别搞混淆!0 M7 a# d5 d- _, \2 b8 v