Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何找到布尔3x3网格算法的所有配置_C#_Arrays_Algorithm - Fatal编程技术网

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

C# 如何找到布尔3x3网格算法的所有配置,c#,arrays,algorithm,C#,Arrays,Algorithm,我需要计算3x3布尔网格的所有唯一配置。 我有一个3乘3的网格 中心是参考点 围绕中心的每个磁贴可以是true,也可以是false 如果一个或多个磁贴处于真实状态,则为配置 由于我需要一种方法来计算每个配置的true条目数,因此每个网格单元都分配了一个数字 我已经开发了一系列数字,它们可以组合成8或更少的无限配置,而不会产生重复项:(1,5,9,11290,31,73990) 将配置中的所有数字相加后,它们相加为一个唯一的数字,可用于标识该配置。因此,这是一个非常有用的布尔网格系统 该网格

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

  • 我有一个3乘3的网格
  • 中心是参考点
  • 围绕中心的每个磁贴可以是
    true
    ,也可以是
    false
  • 如果一个或多个磁贴处于真实状态,则为配置
  • 由于我需要一种方法来计算每个配置的
    true
    条目数,因此每个网格单元都分配了一个数字
  • 我已经开发了一系列数字,它们可以组合成8或更少的无限配置,而不会产生重复项:
    (1,5,9,11290,31,73990)
  • 将配置中的所有数字相加后,它们相加为一个唯一的数字,可用于标识该配置。因此,这是一个非常有用的布尔网格系统

该网格的真值表如下所示:

1,  5,  9,
11, 0,  290,
31, 73, 990
如果中间磁贴有1个连接,则有8种可能性:

[1,5,9,11,290,31,73,990]
[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
如果中间磁贴有2个连接,则有以下几种可能性:

[1,5,9,11,290,31,73,990]
[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行2()
{
列表=新列表();
int[]t=新的int[]{1,5,9,11290,31,73990};
字符串s=“[”;
int start=0;
对于(int i=开始;i
这里是另一种方法

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

    100 0 0 1 11

  • 上述配置意味着中心有5个连接,左上、右下、左下、右下

  • 此配置可以表示为8位整数。最小值为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将有位数。

    为什么不使用1,2,4,8,16,32,64128?然后你可以进行popcount。我认为popcount对我来说有点太高级了。很好。谢谢