C - Nクイーン問題DFS

チェッカーボード-NにN * Nクイーンは、(それらが互いを攻撃しないように配置され、すなわち、同じ列内の任意の2つのクイーンは、同じ列が、斜めの角度で基板フレーム45に許可されていない許可しません。 
あなたのタスクは、指定されたNのために、どのように多くのそこに置か取得の合法的な方法です。 

入力総行数、各行の正の整数N≤10、クイーンボードの数を表し、n = 0の場合は、終了を示します。ライン出力数、各ライン異なる配置クイーン対応する入力ラインの数を表す正の整数。サンプル入力

1 
8 
5 
0

サンプル出力

1つの
92 
10 
DFSのタイトルにNクイーン問題思考のより一般的な方法でなければなりません:N女王は、i行目であるので、私たちはどこ女王記録して、i番目の行を占有する各女王ので、女王N行N列が形成されています列は、ABSとすることができる対角線上にいるかどうかを決定することができるように(マーク[I] -mark [ X])== ABS(IX) の傾きが1 !;に等しいかどうかを決定します
書式#include <iostreamの> 
書式#include <math.h>の
書式#include <CStringの>
 使用して 名前空間はstd;
int型のn;
int型のマーク[ 15 ]。// 保存皇后在的每一列
int型ANS;
int型 ARR [ 11 ]。
int型のチェック(INT X){
     ためint型 i = 1 ; iは、X <; iは++ 
    { 
        場合(ABS(マーク[I] -mark [X])== ABS(IX)||マーク[I] == マーク[X])
             戻り 0 
    } 
    リターン 1 
}
ボイド DFS(INT X){
     場合(X> N){ 
        ANS ++ 返します
    } 
    のためにint型 i = 1 ; iがn = <; iは++ ){ 
        マーク[X] = I。
        もし(チェック(X)){ 
            DFS(X + 1 )。
        } 
    } 
} 

int型のmain()
{ 
    ためint型 i = 1 ; iは<= 10 ; I ++ ){
 //         のmemset(マーク、0、はsizeof(商標))。
        = ANS 0 ; 
        N- = I; 
        DFS(1。); 
        ARR [I] = ANS; 
    } // ,,またはテーブルTLE再生され
    ながら(N-CIN >> && N-){ 
        COUT << ARR [N-] << ENDLと、
    } 
    戻り 0 ; 
}

 



おすすめ

転載: www.cnblogs.com/Accepting/p/11237597.html