问题描述
我试图了解生成迷宫的递归回溯算法的特定 Ruby 实现:https://weblog.jamisbuck.org/2010/12/27/maze-generation-recursive-backtracking
我已阅读并(至少在某种程度上)了解算法中的步骤。然而,由于我在 Ruby 方面缺乏经验,尤其是处理按位运算,Jamis Buck 在他的博客中提供的递归方法真的让我感到困惑。特别是第 40 和 41 行:
grid[cy][cx] |= direction
grid[ny][nx] |= OPPOSITE[direction]
我知道这里执行的 OR 操作是为了使其满足条件中所见的单元格“已经遍历”的要求:
... && grid[ny][nx] == 0
不过,据我所知。为什么这些不能只是布尔值呢?对原始存储的相反方向的 grid[ny][nx]
执行 OR 操作有什么意义?
对不起,如果这是我没有看到的微不足道的东西。总的来说,算法和 Ruby 还是比较新的。
解决方法
设想一个迷宫作为房间的网格,其中每个室具有其自己的独立强>壁。
为什么不能这些仅仅是布尔呢?
作者点在于
我一般实行字段作为位域的网格(其中每个单元中的比特表示哪个方向通路已被刻)
他实施的状态强>每个房间的4个比特,其中0
是一个壁,和1
是一个 “通道”。
如果你有4个布尔值实现它,你会花更多的代码和内存。
在网格[ny][nx]上用原来存储的相反方向进行OR运算有什么意义?
要瓜分两个房间之间的通道是独立您需要删除的双墙墙。 例如:当你想使的北的通道,你必须删除的北的当前房间的墙壁和南的相邻房间的墙壁上。
什么是后面上的“当前的”小区和相邻其右侧进行或运算的意义吗
(grid[y][x] | grid[y][x+1]) & S != 0
字面意思是 “如果目前的房间或右一个具有南通道”。让翻译this part到伪代码:
IF (current room has no Bottom wall) print " " ELSE print "_"
IF (current room has no Right wall)
IF (either(current room OR Right one) has no Bottom wall) print " " ELSE print "_"
ELSE
print "|"
END
通过改变空间.
,两个水平相邻的室(与通道)底部可能看起来像___
或...
或.._
或_..
和线59个控制在该模式中的第二字符的逻辑。
可以固定种子(线14)和比变化的逐位OR 为位与在管线59((grid[y][x] & grid[y][x+1]) & S != 0
)以查看在显示改变