using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Permutations
{
///
/// リストの拡張メソッド
///
public static class MyListExtensions
{
///
/// 人間が読みやすいように表示
///
///
///
///
public static string ToPrettyString(this List list)
{
var str = new StringBuilder();
str.Append(string.Format("[ n = {0}", list.Count));
if (list.Count > 0)
{
str.Append(" : ");
for (var i = 0; i < list.Count; ++i)
{
var e = list[i];
str.Append(e.ToString());
if (i < list.Count - 1)
str.Append(", ");
}
}
str.Append(" ]");
return str.ToString();
}
}
class Program
{
static void Main(string[] args)
{
var list = new List(Enumerable.Range(1, Convert.ToInt32(Console.ReadLine())));
var results = Permutations(list);
Console.WriteLine("length = {0}", results.Count);
foreach (var r in results)
Console.WriteLine(r.ToPrettyString());
Console.ReadKey();
}
static List> _Permutations(List list, List result)
{
if (list.Count <= 0)
return new List>() { result };
var result1 = new List>();
for (var i = 0; i < list.Count; ++i)
{
var n = list[i];
var result2 = new List(result);
result2.Add(n);
var list2 = list.Take(i).Concat(list.Skip(i + 1)).ToList();
result1.AddRange(_Permutations(list2, result2));
}
return result1;
}
/*
[1, 2, 3]の順列を列挙する
最初の要素を取って、残りの要素たちを再起でつなげる
*/
static List> Permutations(List list)
{
return new List>(_Permutations(list, new List()));
}
}
}