完全な配列は何ですか?
完全なアラインメント(全順列)。これは一般的に結果の順列に応じて特定の順序で配置された1からn nは整数番号と呼ばれるN、および完全な配列は、N個の整数のすべての順列を指す形成することができます。
例1,2,3のための3つの整数のために
(1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1)がいっぱいです配置。
だから、どのようにこの種の問題の全体の構成を解決するには?問題は、「整数のn個の出力完全な配列に1」として記載されている場合、ビューのポイントは、再帰的な検討から、それはいくつかのサブ問題に分割することができます。
全体の配置から始まる「出力2」...「「完全配列の先頭に出力1」は、完全な配列Nの先頭に出力されます。」現在の構成を格納するために使用されるアレイPを設定したい場合、Aをリセットします
ハッシュテーブル[x]は整数xが真として配列P上に既にある、請求ハッシュアレイハッシュテーブル、。(の完全な配列は一度だけそれぞれ整列し、結局)。
今、Pフィルのn個の最初のビットを配置するためです。レッツは、これはP [インデックス-1]にP [1]が完了していることを前提とし、P [インデックス]を埋めるために準備ができています。もちろん、私たちは、次の場合、nに1を列挙する必要があります
P [索引-1](すなわち、ハッシュテーブル[X] == FALSE)に現在のデジタルX P [1]ではない、それを置くハッシュテーブル[X]がtrueに設定されているときに、P [インデックス]充填その後、最初に対処します
インデックス+ 1ビット(すなわち、再帰的);再帰が完了すると、次にハッシュテーブル[x]は還元部位偽なので、P [インデックス]は、次の数を埋めること。
次のように私は単にグラフのどのような数を描きました:
コードは以下の通りであります:
1の#include <stdio.hの> 2 3。 4。 ボイド generateP(int型のインデックス) 。5 。6 CONST INT MAXN = 11 ; 7 8。 INT N-; 9 INT P [MAXN]、ハッシュテーブル[MAXN] = { 0 }; 10 int型メイン(){ 11 12は、 INT配列[ 3 ] = { 1、2、3 }; 13である 14 N- = 3は、 15 16 // 0番から現在処理アレイが開始 17 generateP(1 )。 18 リターン 0 。 19 } 20 21 22 空隙 generateP(int型のインデックス){ 23 24 場合(インデックス== N + 1 ){ 25 のために(INTは iは= 1 ; I <= N; I ++ ){ 26 のprintf(" %dの" 、Pを[I ]); 27 } 28 のprintf(" \ n " ); 29 // リターン。 30 } 31で 32 // 再帰部材 れる33 のために(INT X = 1であり、x <= N-であり; x ++){ // 列挙1からnまで、充填しようとすると、P [インデックス]× 34である IF([X] ==ハッシュテーブル0) { // xはPにP [0] [索引-1]でない場合に 35 P [インデックス] = X; // 最初のビットのインデックスPが、xとする、すなわちX現在の構成に追加された 36 のハッシュテーブル[X] = 1 ; // レコードXはPで(再利用可能)を有する 37 [ (+インデックスをgenerateP 1。); // 号インデックス+ 1ビット処理装置 38は、 ハッシュテーブル[X] = 0 ; //処理されたPサブ問題の[インデックス]ここで、x、還元状態 39 } 40 } 41 }
あなたは次のように出力結果は見ることができます。
このアイデアの前に、私たちは一致しています。すなわち、再帰的な視点を考慮し、「フル・アレイ1の先頭に出力が」、「完全な配列2の先頭に出力が」、「3は、全体装置の出力から始まります。」
もう一つの方法
1の#include <stdio.hの> 2 3 4 5 6 ボイドスワップ(INT A []、int型 I、INT J)。 7 ボイドプリントアレイ(INT A []、INT N); 8 ボイドパーマ(INT A []、INT P、INT Q)。 9 10 INT メイン(){ 11 12 のint A [ 3 ] = { 1、2、3 }。 13 パーマ(A、0、3 )。 14 15 戻り 0 ; 16 } 17 18 ボイドスワップ(INT A []、int型 I、int型のJ){ 19 のint TEMP = A [i]は、 20 A [I] = A [J]。 21 A [J] = TEMP。 22 } 23 24 ボイドプリントアレイ(int型 A []、INT N){ 25 のために(INT iは= 0、I <N; I ++ ){ 26 のprintf("%のD "A [I]); 27 } 28 のprintf(" \ n " ); 29 } 30 31 空隙パーマ(INT A []、INT P、INT Q){ 32 であれば(P == Q){ 33 プリントアレイ(A、Q); 34 } 35 36 のために(INT I = P、I <Q、I ++ ){ 37 スワップ(A、P、I); 38 パーマ(A、P + 1 、Q); 39 スワップ(A 、P、I); 40 } 41 }