.NET 4.x Алгоритм перебора вариантов - C#
Формулировка задачи:
Кто нибудь может подсказать эффективный алгоритм без рекурсии желательно:
на входе есть массив массива, нужно получить все возможные варианты:
например:
вход:
{
{1}
{2,3}
{4,5}
}
выход:
{
{1,2,4}
{1,2,5}
{1,3,4}
{1,3,5}
}
Решение задачи: «.NET 4.x Алгоритм перебора вариантов»
textual
Листинг программы
static IEnumerable<IEnumerable<T>> PowerSet<T>(IEnumerable<T> initialSet)
{
var set = new List<IEnumerable<T>>() { Enumerable.Empty<T>() };
return initialSet.Aggregate((IEnumerable<IEnumerable<T>>)set, (x, y) => x.Concat(x.Select(z => z.Concat(new List<T>() { y }))));
}
static void Main()
{
int[][] arr =
{
new[] {1},
new[] {2,3},
new[] {4,5},
};
Console.WriteLine(string.Join(Environment.NewLine, PowerSet(arr.SelectMany(x => x).Distinct()).Select(s => '{' + string.Join(",", s) + '}')));
Console.ReadKey(true);
}