日期:2014-05-20  浏览次数:20966 次

求一个简单的小算法
编一个排列组合的小程序,要求是这样运算的:在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;
            }
        }
    }
}