当前位置: 代码迷 >> .NET分析设计 >> 简单的小算法
  详细解决方案

简单的小算法

热度:4861   发布时间:2013-02-25 00:00:00.0
求一个简单的小算法
编一个排列组合的小程序,要求是这样运算的:在A列中输入一列数据 1、2、3、4......n(数据个数可以自定),要求自动排列组合,结果按顺序显示在B列里,组合出的数据中不能有重复的元素。比如A列中输入1、2、3,B列中就会列出1、2、3、12、13、21、23、31、32、123、132、213、231、312、321
最好用VB语言来写.

------解决方案--------------------------------------------------------
C# code
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            List<string> list = new List<string>();            foreach (var item1 in Combo("123".ToList()))                foreach (var item2 in Arrange(item1, new List<char>()))                    Console.WriteLine(new string(item2.ToArray()));        }        static IEnumerable<List<T>> Arrange<T>(List<T> source, List<T> current)        {            if (current.Count == source.Count)                yield return current;            else                foreach (var item in source)                    if (!current.Any(x => x.Equals(item)))                        foreach (var item1 in Arrange(source, current.Union(new List<T>() { item }).ToList()))                            yield return item1;        }        public static IEnumerable<List<T>> Combo<T>(List<T> source)        {            for (int i = 1; i <= source.Count; i++)                foreach (var item in _Combo(source, i))                    yield return item;        }        static IEnumerable<List<T>> _Combo<T>(List<T> source, int len)        {            if (len <= 0)            {                yield return new List<T>();            }            else            {                int[] pos = new int[len];                for (int i = 0; i < len; i++) pos[i] = i;                while (pos[0] < source.Count - len)                {                    List<T> newlist = new List<T>();                    for (int i = 0; i < len; i++) newlist.Add(source[pos[i]]);                    for (int i = len - 1; i >= 0; i--)                    {                        if (pos[i] < source.Count - len + i)                        {                            pos[i]++;                            for (int j = i + 1; j <= len - 1; j++)                                pos[j] = pos[i] + j - i;                            break;                        }                        else                        {                            continue;                        }                    }                    yield return newlist;                }                List<T> last = new List<T>();                for (int i = source.Count - len; i < source.Count; i++)                    last.Add(source[i]);                yield return last;            }        }    }}
  相关解决方案