[DFS + Nクイーンズ後戻り]

説明

  Nクイーンが互いに(すなわち、ボード内の任意の行、及びいずれかの対角線上の任意のクイーンを配置することができない)を攻撃することなく、N * Nは、ボード上のすべてのプログラミングソルバーに配置されます

表示方法。

エントリー

  数Nは、(3 <= N <= 10)N * Nは、基板サイズを表しています。

輸出

  出力プログラム番号;なしのプログラムであれば、出力「ノー溶質!」

サンプル入力1 

4

サンプル出力1

 
   
2

問題解決のアイデア
  これは遡及検索の古典的な主題です。まず第一に、私たちそれぞれが(私たちはラインで女王のラインを入れているので、その行の一意性を保証するために、)女王がマーク列を与えたマークを入れて、
我々は2つの対角線クイーンズ制御のそれぞれは、その後、それぞれが対角を持っていることがわかりましたプラス等しい縦、横、縦または横に保存等しい座標のいずれか:このような特性を満足します。
二つの配列を開くために決定されます。
問題の解決策
1つの#include <ビット/ STDC ++ H.>
 2  使用して 名前空間STD;
 3  int型 N-、NUM = 0 ;
 4  BOOL L [ 10001 ];各カラムの//タグ
 5。 BOOL X [ 10001 ]; //横軸、縦軸を追加
 6  BOOL Y [ 10001 ]; //保存横座標、縦軸
 7  BOOL MP [ 10001 ] [ 10001 ]; //マップ(出力便利)
 。8  ボイドクイーン(INT ANS)
 9  {
 10      IF(N-ANS == + 1 )/ /女王もし8プラス上に置くためのプログラム
 11を     {
12は          ++ NUM ;
 13である         
14          リターン;
 15      }
 16      のためにINT J = 1。 ; J <= N; J ++ 17      {
 18で         IF(!!! L [J] && X [ANS-J] && Y [ANS + J]) //女王が競合を入れない場合
 。19          {
 20である              L [J] = trueに21であり、              X [ANS-Jは、= trueに22であり、              Y [J ANS +は] = trueに23である              MP [ANS] [J]が= trueに、 //マーキング
 24              女王(ANS + 1); //クイーン入れ
 25              L [J]は= falseに26であり、              X [ANS-Jは、= falseに27              Y [J ANS +は] = falseに28              MP [ANS] [j]は= falseに; //マーク解除(バック)
 29          }
 30      }
 31で     返す;
 32  }
 33は 、INT (メイン)
 34である {
 35      CIN >> N-、
 36      クイーン(1 );
 37 [      COUT << NUM;
 38は、     戻り 0 ;
 39 }

 

 

おすすめ

転載: www.cnblogs.com/hualian/p/11031988.html