获取给定数字的所有组合

时间:2014-09-18 11:23:06

标签: .net arrays vb.net

我想获得存储在数组中的所有可能的数字组合。

例如:

使用{1,2,3,4}返回的第一个数组

1,2,3,4
1,3,4,2
1,4,2,3
2,3,4,1
2,4,1,3 etc

我怎么能这样做?

只是为了澄清 - 取一组数字:{1,2,3,4},重新排列数字序列,返回一个新数组(添加到列表中),然后重复直到找到所有可能的组合。

由于

2 个答案:

答案 0 :(得分:1)

Here is a answer包含您想要的内容。如果您阅读其他答案,其他几种方法可以更快地运行,但使用它们会更复杂一些。

这是相关的代码,而非我自己的代码。

public static IEnumerable<IEnumerable<T>> QuickPerm<T>(this IEnumerable<T> set)
{
    int N = set.Count();
    int[] a = new int[N];
    int[] p = new int[N];

    var yieldRet = new T[N];

    List<T> list = new List<T>(set);

    int i, j, tmp; // Upper Index i; Lower Index j

    for (i = 0; i < N; i++)
    {
        // initialize arrays; a[N] can be any type
        a[i] = i + 1; // a[i] value is not revealed and can be arbitrary
        p[i] = 0; // p[i] == i controls iteration and index boundaries for i
    }
    yield return list;
    //display(a, 0, 0);   // remove comment to display array a[]
    i = 1; // setup first swap points to be 1 and 0 respectively (i & j)
    while (i < N)
    {
        if (p[i] < i)
        {
            j = i%2*p[i]; // IF i is odd then j = p[i] otherwise j = 0
            tmp = a[j]; // swap(a[j], a[i])
            a[j] = a[i];
            a[i] = tmp;

            //MAIN!

            for (int x = 0; x < N; x++)
            {
                yieldRet[x] = list[a[x]-1];
            }
            yield return yieldRet;
            //display(a, j, i); // remove comment to display target array a[]

            // MAIN!

            p[i]++; // increase index "weight" for i by one
            i = 1; // reset index i to 1 (assumed)
        }
        else
        {
            // otherwise p[i] == i
            p[i] = 0; // reset p[i] to zero
            i++; // set new index value for i (increase by one)
        } // if (p[i] < i)
    } // while(i < N)
}

使用此扩展方法,您可以array.QuickParm.Select(innerEnum => innerEnum.ToArray()).ToArray()将此结果作为数组数组获取。

答案 1 :(得分:-1)

Byte[,] square4 = new Byte[,] { { 1, 2, 3, 4 }, { 1, 3, 4, 2 }, { 2, 3, 4, 1 }, { 2, 4, 1, 3 } };