[パズル]コイン150 (100円玉、50円玉をつかったパズル)

問題
縦6×横6の升目の中に、100円玉6個、50円玉6個を入れてください。そのとき、縦 6列、横6列、対角線2列の合計14列の、どこも合計が150円になるようにしてく ださい。

Solveボタンを押すと、探索を開始し、答えを表示します。

この問題も例に漏れず、深さ優先探索(バックトラッキング)で解を求めています

今回解いたプログラムでは、まずは、100円玉を6個おき、その後に50円玉を置い てゆくという方法をとっています。
100円玉を置く際は、14の列で、200円以上の 列が出ないようにコインを置いています。

この条件で6個の100円玉を置き終わったら、50円玉を置いていき、その際、各列 の合計が150円に
なるものだけを解としています。

鏡像は、ほんの一部分だけを省いています。
想像以上に解の数が多かったですね。

この探索を行うのが、Solverクラスで、コインを置けるか、ルール通りかを判断するのは、MyBoardクラスです。
この2つは、Silverlightに依存していません。

※ このプログラムは、そのほかのプログラムでも利用する Boardクラス、 BoardCanvasクラスを利用しています。
    Boardクラス、 BoardCanvasクラスのソースコー ドはこちらに掲載しています。

なお、BoardCanvasを継承し、MyCanvasクラスを定義しています。このMyCanvasクラスでは、
DrawPieceメソッドをoverrideし、規定の○●の描画ではなく、100,50を表示するように しています

以下、C#+Silverlightのコードです。

■Solver.cs
   

■MyBoard.cs


■MainPage.cs (MyCanvasクラス含む)
 

■MainPage.xaml