私は、各要素が元の場所とは異なる順列で作業しています。{入力の長さ、行、桁}を指定すると、出力番号が得られるアルゴリズムが必要です。次に例を示します。
入力長が4の場合、0123のすべての順列は次のとおりです。
0123,0132,0213,0231,0312,0321,
1023,1032,1203,1230,1302,1320,
2013,2031,2103,2130,2301,2310,
3012,3021,3102,3120,3201,3210
同じ場所に数字がない(すべての数字が移動した)順列:
1032,1230,1302,
2031,2301,2310,
3012,3201,3210
番号付けは0から始まるため、関数への入力が{4,0,0}の場合、出力は0番目(最初)の順列の0番目(左端)の桁になります。1032の最初の桁は1です。
入力が{4,1,1}の場合、出力は1230の2桁目である2です。
行番号は、順列の数よりも大きい場合があります。その場合、順列の数を法として余りを取ります(上記の場合、9を法とする行)。
C言語では素晴らしいでしょう。
(宿題ではなく、仕事用です。知っておく必要がある場合はカッコウのハッシュです。各段階で行うスワップをランダムに選択して、テーブルの数が2を超える場合にBFSよりも優れているかどうかを確認したいと思います。 。)