日期:2014-05-17  浏览次数:21000 次

排列组合
假设:1,2,3,4,5 五个数字选3组合

我只会得到 123,124,125,134,135,145,234,235,245,345的10种组合

那把这10个组合再排列
比如: 123 得到321、312、213、231,132,123六个组合
  245 得到524、542、425、452、254、245六个组合
  ... ...

10*6 = 60个

谢谢

------解决方案--------------------
C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "12345";
            List<string> list = new List<string>();
            foreach (var i in Combo(s, 3))
            {
                list = list.Union(Arrange(i)).ToList();
            }
            Console.WriteLine("count: " + list.Count);
            list.ForEach(x => Console.WriteLine(x));
        }


        static IEnumerable<string> Arrange(string source)
        {
            for (int i = 0; i < source.Length; i++)
            {
                if (source.Length == 1)
                {
                    yield return source;
                }
                else
                {
                    foreach (var x in Arrange(source.Substring(0, i) + source.Substring(i + 1)))
                    {
                        yield return source[i] + x;
                    }
                }
            }
        }

        static IEnumerable<string> Combo(string source, int len)
        {
            int[] pos = new int[len];
            for (int i = 0; i < len; i++) pos[i] = i;
            while (pos[0] < source.Length - len)
            {
                string str = "";
                for (int i = 0; i < len; i++) str += source[pos[i]];
                for (int i = len - 1; i >= 0; i--)
                {
                    if (pos[i] < source.Length - len + i)
                    {
                        pos[i]++;
                        for (int j = i + 1; j <= len - 1; j++)
                        {
                            pos[j] = pos[i] + j - i;
                        }
                        break;
                    }
                    else
                    {
                        continue;
                    }
                }
                yield return str;
            }
            yield return source.Substring(source.Length - len);
        }
    }
}