python-全配列数の生成

6804 ワード

【問題の説明】整数N(1<=N<=10)を入力し、1~Nから全ての整数の全配列を生成する.
【入力形式】整数Nを入力します.
【出力形式】出力はN!行は、1~Nのすべての整数の1つから全配列され、各整数間はスペースで区切られている.各行の全配列は繰り返されない.出力各行は「小数優先」の原則に従い、各全配列では小さい数をできるだけ前に出力します.各行の出力を1つの数字と見なすと、すべての出力が昇順数列を構成します.具体的なフォーマットは出力サンプルを参照してください.
【サンプル入力1】1
【サンプル出力1】1
【例説明1】整数N=1を入力し、その全配列は1つのみである.
【サンプル入力2】3
【サンプル出力2】
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
【サンプル説明2】整数N=3を入力し、整数1、2、3のすべての全配列を要求し、N!=6行です.そして1先頭の全配列数を出力し、2先頭の全配列数を出力し、最後に3先頭の全配列数を出力する.この原則は、1で始まるすべての全配列においても同様に従う.
【サンプル入力3】10
【サンプル出力3】
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 10 9
1 2 3 4 5 6 7 9 8 10
1 2 3 4 5 6 7 9 10 8
1 2 3 4 5 6 7 10 8 9
1 2 3 4 5 6 7 10 9 8
1 2 3 4 5 6 8 7 9 10
1 2 3 4 5 6 8 7 10 9
1 2 3 4 5 6 8 9 7 10
1 2 3 4 5 6 8 9 10 7

【例説明3】整数N=10を入力し、整数1、2、3、…、10の全ての全配列を要求する.上記の例では、出力の最初の10行を示します.
【運転時間】1回の運転時間を20秒以内に制限すること.この時間を超えるとプログラムエラーとなります.ヒント:Nが大きくなると、運転時間が急激に増加します.プログラミングではアルゴリズムをできるだけ最適化し、実行効率を向上させることに注意してください.
q = []
def perm(n ,begin , end):#         
   global q# q       
   if begin >= end:#            
        q += n
   else:
       i = begin
       for num in range(begin , end):
           n[num], n[i] = n[i], n[num]
           perm(n, begin + 1, end)
           n[num], n[i] = n[i], n[num]
n = int(input())#    n
a = []
for i in range(1, n+1):#  1~n   
    a.append(i)
perm(a , 0 , n)
b = []
temp = 1
for w in range(1 , n+1):#      
    temp *= w
for j in range(0 , temp):# perm q         
   b.append(q[j*n:j*n+n])
ss = sorted(b)#  
for r in ss:
    for c in r:
        print(c , end=' ')
    print()