更新:这被称为de Brujin torus,但我仍然需要在C#中找出一个简单的算法。
http://en.wikipedia.org/wiki/De_Bruijn_torus
http://datagenetics.com/blog/october22013/index.html
我需要尽可能密集地组合3x3位网格的所有值。通过一个3x3位网格,我的意思是一个3x3网格,其中每个地方有点类似于这个问题中的打孔概念:
Find all combinations of 3x3 holepunch
XXX .X. ...
XXX .X. .X.
XXX .X. ...
我想打包所有512(实际上是256,因为中心位始终打开)可能的值,以便它们在单个NxM网格中重叠。
不完整的例子:
此示例将~25个可能值打包到7x7网格中。
.......
.X.XXX.
.......
.X.XXX.
.X.XXX.
.X.XXX.
.......
我手动尝试了许多不同的技术,但无法提出简单的算法。
所以,我想编写一个C#程序来创建它,但我也没有看到一个简单的方法。
对我来说,甚至没有一种明显的蛮力方法。似乎任何暴力尝试都会接近512!在更坏的情况下组合。
每条边只有8个可能的值。
X...X.XXX. //(8+2 bits) Exhausts all values in the same problem with 1-Dimension.
.X.XXX. //(5+2 bits) The above simplifies when the center bit must be on.
这实际上将用于基于二维拼图的游戏。
游戏中有N个可能的碎片。鉴于地面可以在任何情况下发生,设计师需要一种方法来表达应该针对任何给定情况选择哪个瓷砖。
包含所有可能情况的紧凑网格是指定在每种情况下使用哪个磁贴并消除所有冗余的最有效方法。
....
.XX.
.XX.
....
以上是允许表达4种情况的基本模式,我将修改它以使用其他ascii值来表示在每种情况下应该使用的结果:
....
.AG.
.HH.
....
其中A,G,H各自代表应该用于每种情况的特定模式。
因此,如果找到以下模式:
...
.XX
.XX
这与上面导致'A'的模式匹配,因此在这种情况下将使用'A'。
???
?A?
???
目的是详尽地表达每种可能出现的情况。
我能够尝试这一点,并发现结果太随机,无法很好地实现目标。作为一个人,很难在每种情况下选择正确的值,因为或者是混乱。类似模式的手动分组仍然有效。
答案 0 :(得分:3)
让我们将每个高度为3的列视为0到7之间的单个数字,我们可以这样做,因为有8个可能的高度为3的列。现在,将所有512个可能的3x3模式打包到最小可能的3xN大小的网格中相当于找到de Bruijn sequence with parameters B(8, 3)。这个网格的大小 3x514 :在第一个3x3之后,每增加3x3,我们只花费1个额外的列,这对于高度为3的网格来说显然是最好的。
基于该维基百科页面,似乎最有效的方法是通过查找建立一系列de Bruijn序列B(8,1),B(8,2),B(8,3)欧拉在前一序列的de Bruijn图中循环(因为另一个建议的算法涉及找到哈密顿路径,这是一个与旅行商问题相当的NP完全问题)。
还有de Bruijn tori,de Bruijn序列的2D类似物更直接地接近您打包到NxN网格的目标。然而,从该页面不清楚是否有可能为3x3模式构建de Bruijn圆环(他们只是说已知它们可以构造为偶数尺寸的方形图案,并且奇数大小的方形图案的圆环本身不能是正方形 - 因此可能是NxN出来了),此外,它们很可能满足它们所需的强唯一性约束。
答案 1 :(得分:2)
下面的520位字符串包含所有3x3位模式作为连续的子序列:
XXXXXXXXX.XXXXXXX..XXXXXX.X.XXXXXX...XXXXX.XX.XXXXX.X..XXXXX..X.XXXXX....XXXX.XXX.XXXX.XX..XXXX.X.X.XXXX.X...XXXX..XX.XXXX..X..XXXX...X.XXXX.....XXX.XXX..XXX.XX.X.XXX.XX...XXX.X.XX.XXX.X.X..XXX.X..X.XXX.X....XXX..XX..XXX..X.X.XXX..X...XXX...XX.XXX...X..XXX....X.XXX......XX.XX.XX.X..XX.XX..X.XX.XX....XX.X.XX..XX.X.X.X.XX.X.X...XX.X..X..XX.X...X.XX.X.....XX..XX...XX..X.X..XX..X..X.XX..X....XX...X.X.XX...X...XX....X..XX.....X.XX.......X.X.X.X..X.X.X....X.X..X...X.X...X..X.X......X..X..X.....X...X....X.........XXXXXXXX
或者,如果您愿意,可以使用j_random_hacker的版本:
............X..X..X..X...........X..X..X..X...........X..X..X..X...........X..X..X..X.X..X..X..XX.XX.XX.XX.X..X..X..XX.XX.XX.XX.X..X..X..XX.XX.XX.XX.X..X..X..XX.XX.XX.XX.........X..X..X..X........X..X..X..X........X..X..X..X.X..X..XX.XX.XX.XX.X..X..XX.XX.XX.XX.X..X..XX.XX.XX.XX.X..X..XX.XX.XX.XX......X..X..X..X.....X..X..X..X.X..XX.XX.XX.XX.X..XX.XX.XX.XX.X..XX.XX.XX.XX.X..XX.XX.XX.XX...X..X..X..X.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..
......X..X........X..X.....X..X........X..X.X..XX.XX.X..X..XX.XX.X..XX.XX.X..X..XX.XX.....X..X........X..X.....X..X........X..X.X..XX.XX.X..X..XX.XX.X..XX.XX.X..X..XX.XX...X..X........X..X.XX.XX.X..X..XX.XX.XX.XX.X..X..XX.XX..X..X........X..X..X..X........X..X.XX.XX.X..X..XX.XX.XX.XX.X..X..XX.XXXXXXXX.XX.XXXXXXXXXXX.XX.XXXXXXX.XX..X..X.XX.XX.XX..X..X.XX.XXXXXX.XX.XXXXXXXXXXX.XX.XXXXXXXXX.XX.XXXXXXX..X..X.XX.XX..X..X.XX.XXX.XX.XXXXXXXX.XX.XXXXXX......X..X.....X..X.X..XX.XX.X..XX.XX...X..X.XX.XX.XX.XXXXXXXXXX..
...X.....X.....X.....X.XX.X..XX.X..XX.X..XX..X.....X.....X.....X.XX.X..XX.X..XX.X..XX..X.....X.....X.....X.XX.X..XX.X..XX.X..XX..X.....X.....X.....X.XX.X..XX.X..XX.X..XXXXX.XXXXX.XXXXX.XXXX..X.XX..X.XX..X.XXX.XXXXX.XXXXX.XXXX..X.XX..X.XX..X.XXX.XXXXX.XXXXX.XXXX..X.XX..X.XX..X.XXX.XXXXX.XXXXX.XXX...X.....X.....X.XX.X..XX.X..XX..X.....X.....X.XX.X..XX.X..XX..X.....X.....X.XX.X..XX.X..XXXXX.XXXXX.XXXX..X.XX..X.XXX.XXXXX.XXXX..X.XX..X.XXX.XXXXX.XXX...X.....X.XX.X..XX..X.....X.XX.X..XXXXX.XXXX..X.XXX.XXX...X.XXX..
或者你可以节省空间,只需使用0到511之间的数字,对于大多数计算机来说,都是9位模式。
答案 2 :(得分:0)
“包含所有可能情况的紧凑网格是指定在每种情况下使用哪个磁贴并消除所有冗余的最有效方法。”
我倾向于不同意。
无论折叠练习的结果如何,索引它以检索给定的3x3模式都需要8位索引,因为恰好有256个平铺邻接情况。如果您的紧凑表示包含超过256种模式 - 即,如果混合了不需要的或冗余的模式 - 那么您将需要超过8位用于索引。
但是,8位字节已经可以表示所有可能的邻接情况,如果将其视为位掩码并以某种方式将8位映射到3x3网格的8个外部磁贴。这意味着折叠的主网格 - de Bruijn风格或其他 - 是多余的,可以免除。