首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

排列组合,该怎么处理

2012-10-17 
排列组合假设:1,2,3,4,5五个数字选3组合我只会得到 123,124,125,134,135,145,234,235,245,345的10种组合那

排列组合
假设: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);        }    }} 

热点排行