演算結果:
コードは次のとおりです。
1 #include <bits / stdc ++。H> 2 名前空間std を使用 ; 3 const int MAX = 1024 ; 4 const char * LINE32 = " --------------------- ----------- " ; 5 const bool PRINT_DETAILS = false ; 6 long long n、cnt = 0 ; // nはクイーンの数を表し、cntはソリューションの数を表す7 int vis [ 3 ] [ 2 * MAX + 1 ]; // V [0] []、V [1] []、V [2] [] カラム、主対角線を表す副対角線クイーンがある場合、 8つの // 0手段なし女王は、非ゼロを示し はい、v [0] [4] = 2は、4列目の2行目にクイーンが存在することを意味します9 10 void print(){ 11 cout << LINE32 << endl; 12 cout << " 第" << cnt << " 解決策:" << endl; 13 for(int i = 1 ; i <= n; i ++ ){ 14 if(i!= 1 ){ 15 cout << " 、" ; 16 } 17 cout << " (" << vis [ 0 ] [i] << " 、" << i << " )" ; 18 } 19 cout << endl; 20 for(int i = 1 ; i <= n; i ++ ){ 21 for(int j = 1 ; j <= n; j ++ ){ 22 if(vis [ 0 ] [j]!= i){ 23 cout < < ' x ' ; } else { 25 cout << ' Q ' ; 26 } 27 } 28 cout << endl; 29 } 30 } 31 32 bool check(int row、int col){ // それが(row、col)座標にあるかどうかを確認Place Queen 33 return!(Vis [ 0 ] [col] || vis [ 1 ] [row-col + n] || vis [ 2 ] [row + col]); 34 } 35 void place(int row){ // クイーンを行 36に配置する if(row> n){ 37 cnt ++ ; 38 if (PRINT_DETAILS){ 39 print(); 40 } 41 } else { 42 for(int col = 1 ; col <= n; col ++ ){ 43 if (check(row、col)){ 44 vis [ 0 ] [col] = row; 45 vis [ 1 ] [row-col + n] = vis [ 2] [行+列] = 1 ; 46 桁(行+ 1 ); 47 vis [ 0 ] [col] = vis [ 1 ] [row-col + n] = vis [ 2 ] [行+列] = 0 ; 48 } 49 } 50 } 51 } 52 53 int main(){ 54 // input 55 cout << " Enter the number of queens:" ; 56 cin >> n; 57 // 計算 58 clock_t begin = clock(); 59 place(1 ); 60 clock_t end = clock(); 61 // 出力 62 cout << LINE32 << endl; 63 cout << n << " クイーンの合計は" << cnt << "種類のソリューション" << endl; 64 cout << LINE32 << endl; 65 cout << " 再帰的ソリューション2ソリューション" << n << " クイーンズ問題に時間がかかる" <</ * end-begin << "打点" << * /(double)(end-begin)/ CLOCKS_PER_SEC << " s " << endl; 66は 0を返し ます。 67 } 68 // 14 3〜4秒
再帰的ソリューション1と比較:
①再帰的解の操作1:
②再帰的解法2の操作:
ソリューション1の実行時間は、ソリューション2の実行時間の約3倍であることがわかります。理由を確認することは難しくありません。ソリューション1のスペース効率は高いですが、チェック方法を判断するときにサイクルを繰り返す必要があるという影響であり、ソリューション2はより多く使用します。スペースが増えると、場所が要件を満たしているかどうかを直接判断できます。