アルゴリズムの問題の順列と組み合わせを要約します

完全な配列は何ですか?

完全なアラインメント(全順列)。これは一般的に結果の順列に応じて特定の順序で配置された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 ] = { 123 };
 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 ] = { 123 }。
13      パーマ(A、03 )。
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 }

 

おすすめ

転載: www.cnblogs.com/ManOK/p/12543714.html