2012/04/01(日)C# で next_permutation を使いたいので
わざわざこういうものを再生産しないといけないところにC#の不便さを感じる。
今日の250が落ちたのはこいつがバグってたせい……ぐぅ。
class Algorithm { public static void Swap<T>(ref T x, ref T y) { T tmp = x; x = y; y = tmp; } public static bool NextPermutation<T>(T[] array, int index, int length, Comparison<T> comp) { if (length <= 1) return false; for (int i = length - 1; i > 0; i--) { int k = i - 1; if (comp (array[k], array[i]) < 0) { int j = Array.FindLastIndex(array, delegate(T x) { return comp(array[k], x) < 0; }); Swap(ref array[k], ref array[j]); Array.Reverse(array, i, length - i); return true; } } Array.Reverse(array, index, length); return false; } public static bool NextPermutation<T>(T[] array) where T : IComparable { return NextPermutation(array, 0, array.Length, Comparer<T>.Default.Compare); } } public class Program { static void Main() { int[] array = {5,1,4,3,2}; while (Algorithm.NextPermutation(array)) ; // あるいは Array.Sort(array); do { Console.WriteLine(string.Join(", ", Array.ConvertAll<int, string>(array, i => i.ToString()))); } while (Algorithm.NextPermutation(array)); } }