Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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# 数组中3个值的组合_C#_Arrays_Boolean - Fatal编程技术网

C# 数组中3个值的组合

C# 数组中3个值的组合,c#,arrays,boolean,C#,Arrays,Boolean,我想生成一个数组,其中所有数组的位置组合中都有三个1,而所有其他位置都有0 在本例中,这些将是: var example = new[]{1, 1, 1, 0, 1, 1} 我试图写的代码变得非常冗长和混乱,显然有更好的方法 我尝试使用位于原始阵列位置上方的“计数器”,并像这样移动: 1 1 1 0 0 0 1 1 0 0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 1 0 1 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 0 1

我想生成一个数组,其中所有数组的位置组合中都有三个1,而所有其他位置都有0

在本例中,这些将是:

var example = new[]{1, 1, 1, 0, 1, 1}
我试图写的代码变得非常冗长和混乱,显然有更好的方法

我尝试使用位于原始阵列位置上方的“计数器”,并像这样移动:

1 1 1 0 0 0
1 1 0 0 1 0
1 1 0 0 0 1
1 0 1 0 1 0
1 0 1 0 0 1
1 0 0 0 1 1
0 1 1 0 1 0
0 1 1 0 0 1
0 1 0 0 1 1
0 0 1 0 1 1

等等。

如果数组相对较短(应该是这样以避免内存溢出),您可以使用二进制计数来构建您正在寻找的算法:

  • 假设原始数组有
    N个
    元素
  • 将数组转换为
    int
    ,将每个位置视为二进制数字;称之为
    set

  • 制作一个从0到
    (1)你想让别人为你写吗?还是你有一个具体的问题?我猜递归应该有一个非常基本的方法来实现这一点。你通常在数组中只有6个元素吗?通常数组中会有更多的元素,数组会非常稀疏,大部分是0和一些1。@alan2这里请参见
    CountBits
    以上。
    1 1 1 0 1 1
    c c c
    c c     c
    c c       c
    c   c   c
    
    static uint FromArray(int[] data) {
        uint res = 0;
        for (int i = 0 ; i != data.Length ; i++) {
            if (data[i] == 1) {
                res |= (1U << i);
            }
        }
        return res;
    }
    static int[] ToArray(uint set, int size) {
        var res = new int[size];
        for (int i = 0 ; i != size ; i++) {
            if ((set & (1U << i)) != 0) {
                res[i] = 1;
            }
        }
        return res;
    }
    static int CountBits(uint set) {
        int res = 0;
        while (set != 0) {
            if ((set & 1) != 0) {
                res++;
            }
            set >>= 1;
        }
        return res;
    }
    public static void Main() {
        var example = new[]{1, 1, 1, 0, 1, 1};
        var set = FromArray(example);
        int N = example.Length;
        var res = new List<uint>();
        for (uint mask = 0 ; mask != 1U<<N ; mask++) {
            var candidate = set & mask;
            if (CountBits(candidate) == 3) {
                res.Add(candidate);
            }
        }
        foreach (var s in res.Distinct()) {
            var array = ToArray(s, N);
            Console.WriteLine(string.Join(" ", array.Select(i => i.ToString()).ToArray()));
        }
    }
    
    1 1 1 0 0 0
    1 1 0 0 1 0
    1 0 1 0 1 0
    0 1 1 0 1 0
    1 1 0 0 0 1
    1 0 1 0 0 1
    0 1 1 0 0 1
    1 0 0 0 1 1
    0 1 0 0 1 1
    0 0 1 0 1 1