問題の説明
二つのレンガ壁、両側石積みレンガ幅Wとレンガの幅2、高さ、幅B煉瓦3、高さ、壁の高さH。
高い壁を確保するために、各タイルは水平方向にのみ置く必要があり、我慢できない、と側面に加えて、上部と下部がZhuanfengは表示されませ揃え、次の図を参照してください。
図は、許可します
図は、許可されていません。
次の図は、幅13、メソッドの石積み壁5の高さを示します
与えられた幅W、高さHのために、私はどのように多くのパズルの方法を求めることができますか?
ソリューション
問題は、深さ優先探索を用いて解くことができる探索問題に変換することができます。
特定のアイデア:二次元平面に壁システム、Zhuanfeng記録位置の文字の二次元アレイ、レンガを配置する、実現可能か否か、しないバックをコーディネート。
ソースポイントから開始し、右に再帰検索、コーナーの頂点の検索まで、彼らはすべてのパズルの方法は、検索された、プログラムの終了時に、パズルの方法を持っています。
コードの実装(C ++)
#include <iostreamの> する#include < ストリング > の#defineはい1。 の#define NO 0 使用して 名前空間STD; 静的 INT種類= 0 ; // 実行可能なオプションの数 静的 INT H、Wであり; //は、タイルは、この位置に配置することができるかどうかを決定しますブロック INT ISOK(文字列 ABV、INT W){ IF(W> Wである) を返すNOを、 他の IF(W == Wである) リターンはい; リターン(ABV [W] - ' 0')?NO:はい; } // 深い検索 空隙 DFS(int型 H、int型の W、文字列[]上記){ IF(H ==(H + 1)){ // 出口、適切なプログラムの出力検索 種類を+ + ; のための(INT I = 1 ; Iは<= H; I ++ ) COUT <<上記[I] << ENDL; COUT << " --------------- " << ENDL ; リターン; } ため(INT I =2、I <= 3 ; I ++ ){ IF(ISOK(上記[H- 1 ]、W + I)){ 上記[H] [W + I]は= ' 1 ' ; // 煉瓦を配置すること、レンガマーカー位置。 IF((W + I)== Wである) DFS(Hの + 1、0 、上述); 他の DFS(H、W + 上記I); [H] [Wの上記 + I] = ' 0 ' ; // バック、別のパスを検索します。 } } リターン; } INT メイン(){ CIN >> Wであり; CIN >> H、 文字列の上に[Hが+ 1 ]; のため(int型 I = 0 ;私は<= H; Iは++){ // 初期化文字列の配列、位置Zhuanfengを記録します。 上記[I] = ' 1 ' ; のための(INT J = 1。 ; J <= Wであり; J ++ ) 上記[I] + = ' 0 ' ; } DFS(1、0 、上述); COUTを << <<種類endl; }
業績
入力:9の幅、高さ5。
出力:14