首页 > 解决方案 > 如何查找布尔 3x3 网格算法的所有配置

问题描述

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


该网格的真值表如下:

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); 
    }

标签: c#arraysalgorithm

解决方案


这是另一种方法。

  1. 用 0 和 1 表示 3*3 网格。如果中心与元素 1 有连接,如果不是 0。

    1 0 0 0 0 1 1 1 1

上面的配置意味着中心有5个连接,左上、右、左下、下、右下。

  1. 此配置可以表示为 8 位 int。最小的是 0000 0000 - 没有连接,最大的是 1111 1111 - 所有连接。这两个数字之间的所有数字代表一个独特的组合。

  2. 如果您需要具有 3 个连接的配置,请运行从 0(最小)到 2^9 - 1(最大)的循环,并检查该数字是否具有 3 个设置位 [3 个 1 在其二进制表示中]。如果存储号码。最后将数字转换为 3*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 将具有位数。


推荐阅读