多个数组全排列问题

来源:互联网 发布:六年级体测数据 编辑:程序博客网 时间:2024/06/05 18:14

   多个数组全排列问题:多个数组,

int[] A={1,2,3};
int[] B={4,5};
int[] C={5,6};
......
int[] N={1,2};

N个数组,每个数组中取一个元素,进行全排列。

我写了一个下标进位制的算法,分享给大家,

首先,需要把这N个数组的长度组成新的数组,int[] Counts={A.Length,B.Length,C.Length,....,N.Length}

数组有了后就可以用下面的方法 迭代返回所有排列的索引, 根据索引取对应数组的该索引的元素

 


    static IEnumerator GetQuanPaiLie(int[] Counts)

        {


            int[] nums = new int[Counts.Length];
            for (int x = 0; x < Counts.Length; x++)
            {
                nums[x] = Counts[x] > 0 ? 0 : -1;
            }
            int last = Counts.Length - 1;
            while (nums[0] < Counts[0])
            {
                yield return nums;
                nums[last]++;
                for (int i = Counts.Length - 1; i > 0; i--)
                {
                    if (nums[i] >= Counts[i])
                    {
                        nums[i] = 0;
                        nums[i - 1]++;
                        if (nums[0] > Counts[0])
                        {
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }

        }


调用方法

 static void Main(string[] args)
        {
            int[] Counts = { 3, 1, 3 };
            var a = GetQuanPaiLie(Counts);//
            using (a as IDisposable)
            {               
                while (a.MoveNext())
                {
                    int[] b = (int[])a.Current;                   
                    for (int i = 0; i < b.Length; i++)
                    {


                        Console.Write(b[i]);
                        if (i % Counts.Length == Counts.Length - 1)
                        {
                            Console.WriteLine(";");
                        }
                    }                    
                }                             
            }

   Console.ReadLine();
        }


个人原创,转载请注明……

原创粉丝点击