C# 查找包含所有可能的3x3位模式的NxM网格

C# 查找包含所有可能的3x3位模式的NxM网格,c#,algorithm,bit-packing,C#,Algorithm,Bit Packing,更新:这被称为de Brujin圆环体,但我仍然需要用C#找出一个简单的算法 我需要尽可能密集地组合3x3位网格的所有值。所谓3x3位网格,我指的是3x3网格,其中每个位置都有点类似于本问题中的打孔概念: 3x3位网格示例: 目标 我想打包所有512(实际上是256,因为中心位始终处于启用状态)可能的值,以便它们在单个NxM网格中重叠 不完整示例: 此示例将大约25个可能值打包到7x7网格中 ....... .X.XXX. ....... .X.XXX. .X.XXX. .X.XXX.

更新:这被称为de Brujin圆环体,但我仍然需要用C#找出一个简单的算法


我需要尽可能密集地组合3x3位网格的所有值。所谓3x3位网格,我指的是3x3网格,其中每个位置都有点类似于本问题中的打孔概念:

3x3位网格示例: 目标 我想打包所有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个可能的碎片。考虑到地面在任何情况下都可能出现,设计师需要一种方式来表示在任何给定情况下应选择哪个瓷砖

包含每种可能情况的紧凑网格是指定在每种情况下使用哪个磁贴并消除所有冗余的最有效方法

更新 例子 以上是允许表达4种情况的基本模式,我将对此进行修改,以使用其他ascii值来表示应在每种情况下使用的结果:

....
.AG.
.HH.
....
其中,A、G、H分别表示应用于每种情况的特定模式

因此,如果发现以下模式:

...
.XX
.XX
这与上面导致“A”的模式相匹配,因此在这种情况下将使用“A”

???
?A?
???
目的是详尽地表达每种可能情况的结果

实际上 我尝试了一下,发现结果太随机,无法很好地实现目标。作为一个人,在每种情况下都很难选择正确的价值观,因为这是一种无组织的行为。类似模式的手动分组仍然效果更好。

使用De Bruijn序列将所有3x3模式打包到3xN网格中 让我们把每一个height-3列看作一个介于0和7之间的数字,我们可以这样做,因为有8个可能的height-3列。现在,将所有512个可能的3x3模式打包到最小可能的3xN大小的网格中相当于找到一个。该网格的大小为3x514:在第一个3x3之后,每增加一个3x3只需额外增加一列,这对于高度为3的网格来说显然是最好的

基于Wikipedia页面,似乎最有效的方法是通过在前一个序列的de Bruijn图中找到欧拉循环来建立一系列de Bruijn序列B(8,1),B(8,2),B(8,3)(因为另一个建议的算法涉及寻找哈密顿路径,这是一个NP完全问题,其难度相当于旅行商问题)


也有更直接接近NxN网格目标的de Bruijn序列的2D类似物。但是,从那一页上看,不清楚如何或甚至是否可能为3x3模式构建de Bruijn圆环(他们只是说,我们知道它们可以被构造成偶数大小的正方形图案,而奇数大小的正方形图案的环面本身不可能是正方形的——所以推测NxN是不存在的),此外,它们满足的强唯一性约束可能对您的应用程序是不必要的。

下面的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位模式。

包含所有可能情况的紧凑网格是指定在每种情况下使用哪个磁贴的最有效方法,并消除了所有冗余

我倾向于不同意

无论折叠练习的结果如何,为其编制索引以检索给定的3x3模式都需要8位索引,因为恰好存在256个平铺邻接情况。如果紧凑表示包含256个以上的模式(即,如果混合了不需要的或冗余的模式),则需要更多的索引超过8位用于索引


但是,如果将8位字节视为位掩码,并以某种方式将其映射到3x3网格的8个外部分片,则8位字节已经可以表示所有可能的邻接情况。这意味着折叠主网格(de Bruijn样式或其他样式)是多余的,可以省略。

当您说紧凑时,您的意思是存储网格时,它需要小于512位(64字节)?将这些3x3模式“打包”到的网格是否需要为NxN?或者是否可以为3xN?如果是,我知道一种可爱的方法来实现这一点。@MartinPark在理想情况下会有512位加上边框。没有更好的解决方案。(我想如果允许包装,就连边界也可以消除。)@j_random_hacker它可以是任何大小的NxM,包括3xM。理想情况下,它应该很容易被人阅读,但这还不是我主要关心的。你能说更多关于如何实时访问网格的信息吗?在我看来,简单的从0到511的数字不仅表示,而且都是9位模式。嗯,这比ha更有效每列5123x3网格一个。它减少了1/3的工作量…然而,我希望有比这更好的东西。Th
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
............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..