理解递归回溯算法的 Ruby 实现

问题描述

我试图了解生成迷宫的递归回溯算法的特定 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)以查看在显示改变