Nクイーン問題C ++非再帰ソリューション

演算結果:

 

コードは次のとおりです。

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      forint i = 1 ; i <= n; i ++ ){
 15          if(i!= 1 ){
 16              cout << " " ;
17          }
 18          cout << " " << i <<<< queen [i] << " " ;
19      } 
 20      cout << endl;
21      forint i = 1 ; i <= n; i ++ ){
 22          forint 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

おすすめ

転載: www.cnblogs.com/realize1536799/p/12729277.html