説明
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 }