図1に示すように、バックトラック+(出力辞書式順序)の構成
ボイドプリント(){ int型Iは、 のための(I = 1 ; I <= N; I ++の) COUTが <<成る[I] << ' ' ; COUT << ENDL; } ボイド DFS(INT K){ // ディープ検索関数は、現在のフレームがk個である INT I、 IF(N-Kの==){ // ときに充填 プリント(); // 出力電流溶液 リターン; } ための(I = 1 ; I <= N; I ++)は{ // 1-Nフィルサイクル数 IF(!ファック[I]){ //現在の数を使用しない場合 性交[i]は= 1 ; // タグのクリックが 構成され[K +は1 ] = Iであり; // この数移入配列は DFS(K +は、1。); // 次の記入 性交を[I] = 0 ; // バック } } }
2、深い検索(出力辞書順)
書式#include <iostreamの> 書式#include <stdio.hに> する#include <ベクトル> 使用して 名前空間はstdを、 int型N; ベクトル < int型 > 編曲。 ボイド DFS(ベクトル< 整数 > ANS、int型K){ もし(K == N){ ため(int型 i = 0 ; iがNを<; iは++ ){ COUT << ANS [I] << '「。 } COUT << ENDL。 返します。 } のための(INTI = K。私はNを<; I ++ ){ スワップ(ANS [i]は、ANS [K])。 DFS(ANS、K + 1 )。 } } int型のmain(){ CIN >> N。 以下のために(int型 i = 0 ; iがNを<; iは++ ){ arr.push_back(I + 1 )。 } DFS(ARR、0 ); リターン 0 ; }
3、または深い検索(非辞書順)
オーダーのうちこの出力は、辞書ではありません非常に奇妙な順序です。
書式#include <iostreamの> の#include <fstreamの> 使用して 名前空間はstdを、 int型 ARR [ 10 ]。 ボイドプロセス(int型 K、int型N){ 場合(K == N){ ため(int型 i = 1 ; iがn = <; iは++ ){ COUT << ARR [I] << ' ' 。 } COUT << ENDL。 返します。 } のために(int型 I = kは、iが++; iが<= N){ スワップ(ARR [I]、ARR [K])。 工程(K + 1 、N)。 スワップ(ARR [I]、ARR [K])。 } } int型のmain(){ fstreamのフィン(" data.in " )。 int型のn; フィン >> N; 以下のために(int型 iは= 1 ; iがn = <; iは++ ){ ARR [I] = I。 } プロセス(1 、N) }
4、C ++ algoritgm next_permutation(出力辞書式順序)
書式#include <iostreamの> の#include <アルゴリズム> 書式#include <fstreamの> 使用して 名前空間はstdを、 int型 ARR [ 10 ]。 INT メイン(){ fstreamのフィン(" data.in " )。 int型のn; フィン >> N; 以下のために(int型 iは= 1 ; iがn = <; iは++ ){ ARR [I] = I。 } 一方(next_permutation(ARR + 1、ARR + N + 1 )){ ため(INTI = 1 ; I <= N。私は++ ){ COUT << ARR [I] << ' ' 。 } COUT << ENDL。 } }