fork(23) download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace PartitionTest {
  6. public static class Partitioning {
  7. public static IEnumerable<List<List<T>>> GetAllPartitions<T>(T[] elements) {
  8. var lists = new List<List<T>>();
  9. var indexes = new int[elements.Length];
  10. lists.Add(new List<T>());
  11. lists[0].AddRange(elements);
  12. for (;;) {
  13. yield return lists;
  14. int i,index;
  15. for (i=indexes.Length-1;; --i) {
  16. if (i<=0)
  17. yield break;
  18. index = indexes[i];
  19. lists[index].RemoveAt(lists[index].Count-1);
  20. if (lists[index].Count>0)
  21. break;
  22. lists.RemoveAt(index);
  23. }
  24. ++index;
  25. if (index >= lists.Count)
  26. lists.Add(new List<T>());
  27. for (;i<indexes.Length;++i) {
  28. indexes[i]=index;
  29. lists[index].Add(elements[i]);
  30. index=0;
  31. }
  32. }
  33. }
  34.  
  35. public static void Main()
  36. {
  37. foreach(var part in Partitioning.GetAllPartitions(new[] { 1, 2, 3, 4 })) {
  38. Console.WriteLine(string.Join(",",part.Select(x => "("+string.Join(",",x)+")")));
  39. }
  40. }
  41. }
  42.  
  43. }
Success #stdin #stdout 0.01s 29800KB
stdin
Standard input is empty
stdout
(1,2,3,4)
(1,2,3),(4)
(1,2,4),(3)
(1,2),(3,4)
(1,2),(3),(4)
(1,3,4),(2)
(1,3),(2,4)
(1,3),(2),(4)
(1,4),(2,3)
(1),(2,3,4)
(1),(2,3),(4)
(1,4),(2),(3)
(1),(2,4),(3)
(1),(2),(3,4)
(1),(2),(3),(4)