更新:这被称为 de Brujin 圆环,但我仍然需要在 C# 中找出一个简单的算法。
http://en.wikipedia.org/wiki/De_Bruijn_torus
http://datagenetics.com/blog/october22013/index.html
我需要尽可能密集地组合 3x3 位网格的所有值。通过 3x3 位网格,我的意思是 3x3 网格,其中每个位置有点类似于这个问题中的打孔概念:
3x3 位网格示例:
XXX .X. ...
XXX .X. .X.
XXX .X. ...
目标
我想打包所有 512(实际上是 256,因为中心位始终打开)可能的值,以便它们在单个 NxM 网格中重叠。
不完整的例子:
此示例将大约 25 个可能值打包到 7x7 网格中。
.......
.X.XXX.
.......
.X.XXX.
.X.XXX.
.X.XXX.
.......
已经知道的事情:
- 有 2^9 (512) 个唯一值。
- 我只关心 2^8 (256) 个值,因为我需要始终打开中心位。
尝试
我手动尝试了许多不同的技术,但无法提出一个简单的算法。
所以,我想编写一个 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.
目的
这实际上将用于基于 2d 瓦片的游戏。
游戏有 N 个可能的地块。鉴于地面可以在任何情况下出现,设计师需要一种方式来表达在任何给定情况下应该选择哪个瓷砖。
包含所有可能情况的紧凑网格是指定在每种情况下使用哪个图块并消除所有冗余的最有效方法。
更新
例子
....
.XX.
.XX.
....
以上是允许表达 4 种情况的基本模式,我将对其进行修改以使用其他 ascii 值来表示应在每种情况下使用的结果:
....
.AG.
.HH.
....
其中 A、G、H 各自代表应用于每种情况的特定模式。
因此,如果找到以下模式:
...
.XX
.XX
这与上面导致“A”的模式匹配,因此在这种情况下将使用“A”。
???
?A?
???
目的是详尽地表达每种可能的情况会导致什么。
在实践中
我能够尝试这个,发现结果太随机了,无法很好地实现目标。作为人类,很难在每种情况下选择正确的价值观,因为或者混乱。类似模式的手动分组仍然效果更好。