如何查找布尔 3x3 网格算法的所有配置
Posted
技术标签:
【中文标题】如何查找布尔 3x3 网格算法的所有配置【英文标题】:How to find all configurations of a boolean 3x3 grid algorithm 【发布时间】:2021-06-18 00:14:15 【问题描述】:我需要计算 3x3 布尔网格的所有唯一配置。
我有一个 3 x 3 的网格。 中心是参考点。 围绕中心的每个图块可以是true
或false
。
如果 1 个或多个图块处于真实状态,则为配置。
由于我需要一种方法来计算每个配置的 true
条目数,因此每个网格单元都分配了一个数字。
我开发了一系列数字,它们可以组合成 8 或更少的无限配置而不会产生重复:(1,5,9,11,290,31,73,990)
当配置中的所有数字相加时,它们总和为一个唯一的数字,可用于识别该配置。因此,这是一个非常有用的布尔网格系统。
这个网格的真值表如下:
1, 5, 9,
11, 0, 290,
31, 73, 990
如果中心图块有 1 个连接,则它有 8 种可能性:
[1,5,9,11,290,31,73,990]
如果中心图块有 2 个连接,则有以下可能性:
[6, 10, 12, 291, 32, 74, 991, 14, 16, 295, 36, 78, 995, 20, 299, 40,
82, 999, 301, 42, 84, 1001, 321, 363, 1280, 104, 1021, 1063
我已将前两个配置组分成几行。(第一个被省略,因为它是一次只有一个单元格为真的配置)
void Row2()
list = new List<string>();
int [] t = new int [] 1,5,9,11,290,31,73,990;
string s = "[";
int start = 0;
for (int i = start; i < t.Length; i++
for(int j = i + 1; j < t.Length; j++)
int o = t[i]+ t[j];
if(i == 0 && j == 1)
s += o.ToString();
else
s += ", " + o;
start++;
s = s + "]";
list.Add(s);
【问题讨论】:
为什么不是 1,2,4,8,16,32,64,128?然后你可以做一个popcount。 我觉得流行计数对我来说有点太高级了。 docs.microsoft.com/en-us/dotnet/api/… 【参考方案1】:这是另一种方法。
用0&1表示3*3的网格。如果中心与元素1有连接,如果不是0。
1 0 0 0 0 1 1 1 1
上述配置表示中心有5个连接,左上、右、左下、下、右下。
此配置可以表示为 8 位 int。最小的是 0000 0000 - 没有连接,最大的是 1111 1111 - 所有连接。并且这两个数字之间的所有数字代表一个独特的组合。
如果您需要具有 3 个连接的配置,请运行从 0(最小)到 2^9 - 1(最大)的循环,并检查该数字是否具有 3 个设置位 [3 个 1 在其二进制表示中]。如果存储号码。最后将数字转换为 3*3 配置。
计算 1 的个数有两种方法。
4.1 由于位数固定为 8,因此采用 8 位掩码,其作用是仅提取特定位并将它们相加
bit1_mask = 0000 0001
bit2_mask = 0000 0010
....
bit8_mask = 1000 0000
bits = (n&bit1_mask) + (n&bit2_mask) +.....(n&bit8_mask)
4.2 使用 2 的补码作为掩码获取最后设置的位
c=0;
while(n>0)
n&=-n;
++c;
c 会有位数。
【讨论】:
固体。谢谢以上是关于如何查找布尔 3x3 网格算法的所有配置的主要内容,如果未能解决你的问题,请参考以下文章