我应该用什么数据结构来代表这个板?

时间:2015-07-15 20:05:28

标签: algorithm data-structures unity3d

enter image description here

library(scales)

p + scale_y_continuous(labels=percent)

片断在圆圈之间。目标是填补整个董事会。我需要一种方法来代表董事会的内容。这些碎片可以旋转和翻转。我尝试使用矩阵,但效果不佳。

编辑:示例片段:

enter image description here enter image description here enter image description here

4 个答案:

答案 0 :(得分:4)

我认为矩阵可以正常工作,但你需要小心如何将各个部分组合在一起。以下是上面显示的碎片如何适合3×3拼图的说明:

puzzle pieces represented as combinations of quadrant arcs

我以棋盘方式交替地将圆圈着色为黄色和蓝色,但实际上您应该将每个圆圈视为一组四个象限,因此在这种情况下您需要一个6×6矩阵。然后,拼图可以表示为8个连接的单元集合,这些集合遵循放置它们的单元格的颜色,但是能够在蓝色和黄色之间翻转(例如,“钻石”块被着色{{1}如图所示,如果你把它移到下面的下一个空隙,它会转到Y B / B Y

B Y / Y B

所以这就是你的矩阵在添加这些碎片时的样子。你可以看到“胡子”和“蛇”的形状有相同的形状,但颜色不同:

same pieces represented as blocks

使用constraint satisfaction algorithm来解决这个难题应该非常简单。

答案 1 :(得分:2)

由于电路板非常小,解决此问题的一种方法是将电路板表示为片+位置对的列表。

将每个视为turtle graphics中的一系列绘图命令:

  • D for" draw"
  • R for"右转"
  • L for"左转"
  • T for"转身"。

您帖子中的内容将如下所示:

D-L-D-R-D-T-D-R-D
D-L-D-R-D-R-D
D-L-D-T-D-L-D-T-D-L-D

一件作品的展示位置会添加有关该作品的起点,龟的起始方向以及该作品是否已被翻转的信息,在这种情况下,龟需要更换左转弯,反之亦然。

给出一个单独的片段+位置对的列表,很容易验证它们是否相交"绘制"他们在临时董事会。通过"绘图"可以很容易地验证片段+放置对的列表覆盖整个电路板。所有部分,并检查单元格之间的空白区域。

答案 2 :(得分:1)

我可以看到你的问题和Exact Cover Problem之间有些相似之处。

特别是,斯科特的Pentomino问题在Donald Knuth's seminal papers之一中详细讨论过:Dancing Links(链接到压缩的PostScript格式......你知道这个人)。该论文中使用的数据结构是精确覆盖问题的四向链接表示。

斯科特的Pentomino问题看起来像这样(注意中间的四个位置是空的):

Scott's Pentomino Problem

并通过首先根据精确覆盖问题进行描述来解决。

基本上,Knuth定义了一个包含72列的矩阵:12个五联体中的每一个都有一个,而对于60个细胞中的每一个,减去中心的四个。

然后他为该矩阵构造了所有可能的行,其中列中的一个(1)对应于该片段,并且该片段占据了每列中的1;图中显示的pentomino有1568行。

一旦他有了矩阵表示,他就使用他的算法X(跳舞链接)解决了稀疏矩阵上的确切覆盖问题。

当然,本文还有更多细节。

这是本文所述的焊接四肢问题的图像。

Welded Tetrasticks Problem by Donald Knuth

答案 3 :(得分:0)

考虑使用graph;虽然,该示例使用飞行路径,但仍然有用的是每个位置(图中的节点)可以具有多个连接的节点,这是本文中的问题所描述的。检查游戏板是否已满只是确保板上的每个位置(图中的节点)都连接到每个其他位置(图中的节点)。每个板块可以跨越多个板位置,从而连接图中的那些节点。