ruby - 多算法迷宫构建器的特定数据结构

标签 ruby algorithm data-structures maze

我已经读过this问题,并对我的问题进行了研究,但我发现我还没有合适的答案。

我想在 ruby​​ 中构建一个通用数据结构,用它我可以实现任何我认为合适的(二维、矩形)迷宫生成算法。首先,我将实现 Randomized Prim'sDepth-First Search ,稍后我会想要实现 Sidewinder和别的。目标是能够生成各种不同外观的迷宫。仅供引用,墙并不是一个“填充”的单元格 - 它是两个相邻单元格之间的分隔物,并且要么是实心的,要么不是实心的。

但我面临的问题是所有算法都需要了解不同的事情。例如,Prim 表示选择一个 Cell 并将其 Walls 添加到 wall_list 中。没关系,我可以从这个开始:

class Cell
  def get_surrounding_walls
    # some code
  end
end


class Wall
  @solid = true
  def remove
    @solid = false
  end
end

wall_list = []

但现在我开始对如何存储特定细节感到困惑。我应该有一个多维单元格数组吗?细胞会追踪自己的四壁吗?如果我这样做,那么当我切换墙时,我必须增加复杂性,因为我还需要获取相邻单元格的墙。如果我让一个单元格仅跟踪其右墙和下墙,那么我会增加获取上墙和左墙状态的复杂性。

另一方面,如果单元格和墙维护在单独的列表中,我应该为所有墙使用一个数组,还是为上/下墙使用一个数组,为左/右墙使用一个数组?在第一种情况下,选择随机墙并查询特定墙的状态更容易,但实际构建更困难 - 墙与网格不能很好地对齐。这使得细胞更难了解它周围的墙壁。

我是否应该追踪细胞?常识说它们需要是对象,因为后来的一些算法将要求单元格知道它们的设置。但是如果我想使用某种 Graph ,就像 Adjacency Matrix ,那么整个结构似乎只设置为轨道墙。此外,对于大型迷宫,矩阵会变得非常大。

这可能是分析瘫痪的情况,但事实仍然是我不知道从哪里开始。

最佳答案

为了避免重复墙壁信息,因为单元格可以共享墙壁。让每个单元仅存储顶墙和右墙的状态。您需要处理最左列和底行的边缘情况,因为它们的墙壁状态不会被覆盖。您可以通过引入包含该信息的虚拟单元来做到这一点。

创建这样的哈希

wall[[10,5]] = [1,0]

因此第 10 行第 5 列的单元格有顶墙,没有右墙。

获取牢房的所有墙壁。您必须查询它的底部和左侧单元格

因此,要获取 [10,5] 的所有墙壁,您需要像这样查询哈希

wall[[11,5]][0]
wall[[10,4]][1]

所以单元格 [10,5] 的全套墙是

[ wall[[10,5]][0], wall[[10,5]][1] , wall[[11,5]][0] , wall[[10,4]][1] ]

上面的数组是每面墙从顶部开始顺时针旋转的状态。

因此,墙壁的信息被存储,细胞的墙壁被推断出来。

您还可以使用数组而不是散列来存储墙壁的位置

关于ruby - 多算法迷宫构建器的特定数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26259460/

相关文章:

ruby - 如何在txt文件中存储变量: Ruby

c# - 如何智能解析xml?(使用状态机?)

python - 如何在Python中实现数据库风格的表格

c++ - 链表中头/第一个节点的声明

ruby - 在其父类中定义子类是否非常规?

ruby - 如何访问 Ruby block 内的实例变量?

ruby-on-rails - 使用 Paperclip/Rails 将纵向转换为横向,并将左右填充转换为新图像

algorithm - 如何将 CLI 客户端实现到 golang 守护进程?

c++ - C++ 中的不相交集实现

c++ - 如何在 C++ 中遍历一个类型的每一位