演算結果:
コードは次のとおりです。
1 #include <bits / stdc ++。H> 2 名前空間std を使用 ; 3 #include <bits / stdc ++。H> 4 名前空間std を使用; 5 const int MAX = 1024 ; 6 const char * LINE32 = " ------ -------------------------- " ; 7 const bool PRINT_DETAILS = false ; 8 long long n、cnt = 0 ; // nはクイーンの数、Cntは解の数を表します9 int queen [MAX + 1 ]; 10 11 void print(){ 12 cout << LINE32 << endl; 13 cout << " 第" << cnt << " 个解法:" << endl; 14 for(int i = 1 ; i <= n; i ++ ){ 15 if(i!= 1 ){ 16 cout << " 、" ; 17 } 18 cout << " (" << i <<<< queen [i] << " )" ; 19 } 20 cout << endl; 21 for(int i = 1 ; i <= n; i ++ ){ 22 for(int j = 1 ; j <= n; j ++ ){ 23 if(queen [i]!= j){ 24 cout << ' x ' ; 25 } else { 26 cout << ' Q ' ; 27日 } 28 } 29 cout << endl; 30 } 31 } 32 33 bool check(int row、int col){ // クイーンを(row、col)座標 34 に配置できるかどうかをチェック(int置かれた= 1 ;置かれた<行;配置された++ ){ 35 if(クイーン[配置] == col || abs(行配置)== abs(コールクイーン[配置])){ 36 return false ; 37 } 38 } 39 return true; 40 } 41 void solve(int n){ 42 int row = 1 ; // 行は現在配置されている行を示し、初期値は1で、最初の行から クイーンが配置されることを示します43 queen [row] = 1 ; // つまり、[1] = 1は、最初にクイーンを(1、1) 44に配置する 一方、(row> 0){ // 行の値が最終的に0になるため、すべての条件がチェックされると、最初の行が上方向にバックトラックすると、行の値は0 45 if(row> n){ 46 // ソリューションを見つけてから上方向にバックトラックする必要があり ます。前の行の次の列から確認します47 cnt ++ ; 48 if (PRINT_DETAILS){ 49 print(); 50 } 51 queen [-row] ++ ; 52 } else if(queen [row]> n){ 53 // queen [row]は、現在の行で検出される列の位置を示します 54 // この時点で、行rowのすべての位置がチェックされ、同じ上向きのトレースバック:前の行の次の列からチェック 55 queen [-row] ++ ; 56 } else if (check(row、queen [row] )){ 57 // 最初の列から開始して、一致する位置を見つけ、次の行の配置を開始します 58 queen [++ row] = 1 ; 59 } else { 60 // 今回は、この位置が一致しないことを示しています。この行の次の列の位置を確認してください 61 queen [row] ++ ; 62 } 63 } 64 } 65 66 int main(){ 67 // input 68 cout << " クイーンを入力してください番号:" ; 69 cin >> n; 70 // 計算 71 clock_t begin = clock(); 72 solve(n); 73 clock_t end = clock(); 74 // 出力 75 cout << LINE32 <<ENDL; 76 COUTは、N - << << " クイーン問題があり、" << << CNT " シード溶液" << ENDL; 77 COUT LINE32 << << ENDL; 78 COUT << " 非再帰溶液溶液1 " < <n << " 時間のかかる女王の質問" << / * end-begin << "Dotted" << * /(double)(end-begin)/ CLOCKS_PER_SEC << " s " << endl; 79 return 0 ; 80 } 81 // 14 9〜11 秒
再帰的ソリューション1と比較:
①再帰的解の操作1:
②非再帰的解法1の操作:
あなたは、見ることができ期待に沿っていない再帰的なソリューションの数、非再帰的なソリューションにもう少し1時間未満1つの実行を、時間を実行し、論理的に言えば、非再帰的なソリューションを短くする必要があります非再帰的及び再帰的なソリューション2ソリューションを比較します次のブログ記事2。