如何查找布尔 3x3 网格算法的所有配置

Posted

技术标签:

【中文标题】如何查找布尔 3x3 网格算法的所有配置【英文标题】:How to find all configurations of a boolean 3x3 grid algorithm 【发布时间】:2021-06-18 00:14:15 【问题描述】:

我需要计算 3x3 布尔网格的所有唯一配置。

我有一个 3 x 3 的网格。 中心是参考点。 围绕中心的每个图块可以是truefalse。 如果 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 网格算法的所有配置的主要内容,如果未能解决你的问题,请参考以下文章

如何对 3x3 的单选按钮网格进行分组?

如何在 gridview.count flutter 中创建分区

地理网格搜索算法

Floyd Warshall 算法和网格图

JavaScript-实现网格旋转算法[关闭]

计算二维数组上的路径数(网格旅行者)