【问题标题】:Specific data structure for multi-algorithm maze builder多算法迷宫构建器的特定数据结构
【发布时间】:2014-10-08 14:29:22
【问题描述】:

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

我想用 ruby​​ 构建一个通用数据结构,我可以用它来实现我认为合适的任何(2d,矩形)迷宫生成算法。首先,我将实现Randomized Prim'sDepth-First Search,稍后我将要实现Sidewinder 等。目标是能够生成各种不同外观的迷宫。仅供参考,墙不是“填充”单元格 - 它是两个相邻单元格之间的分隔线,无论是实心的还是非实心的。

但我面临的问题是所有算法都需要了解不同的事物。例如,Prim's 说要选择 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 = []

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

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

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

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

【问题讨论】:

  • 引用伟大的 Fred Brooks 的话:“打算扔掉一个;无论如何,你会的。”
  • 哦,我已经编写和重写了大约 100 行代码,现在只删除了大约 3 或 4 次。似乎没有什么能涵盖我需要的一切:(

标签: ruby algorithm data-structures maze


【解决方案1】:

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

像这样创建一个哈希

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] ]

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

所以墙的信息被存储,细胞的墙被推断出来。

您也可以使用数组而不是哈希来存储墙壁的位置

【讨论】:

    【解决方案2】:

    为每个单元格和每个墙创建一个对象。每个单元格存储其坐标和像{"left"=>left_wall, "up"=>up_wall, "right"=>right_wall} 这样的散列,其中边界单元格缺少条目。墙引用它们的两个相邻单元并存储它们是否是实体的。迷宫对象存储一个二维单元格数组。

    由于您使用 Ruby 进行编程,因此我假设速度不是首要任务。我试图在使用简单和实现简单之间取得平衡。

    以下是一些支持的操作。

    1. 获取单元格的向上邻居。 在哈希中查找 "up" 以获取墙。将单元格与墙的邻居之一进行比较;返回不相等的邻居。
    2. 获取与某个单元格相邻的单元格。遍历哈希值并执行上一步。
    3. 将墙标记为实心/非实心。简单。
    4. 查询墙的状态。简单。
    5. 随机获取一个单元格。简单。
    6. 随机获取一堵墙。我们没有墙的列表,所以我们必须要聪明一点。选择一个随机单元格和一个随机方向。如果该单元格在该方向上有一面墙,则将其返回。否则,请重试。我们可以使用类似的技术获得随机的左/右墙。

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多