Triangle15パズル

問題

以下のような○を組み合わせた逆三角形に「横に並んだ2つの数の差(正数)をその下の○に入れる」という条件を満たして、1~nまでの数字を配置します。
例えば、3段の三角形の場合は、

のように 1~6までの数を入れれば、条件を満たせます。
では、5段の三角形の場合は、どのように配置すれば良いのか考えてください。


※Triangle15Puzzle という名前は僕が勝手に命名したもので、本当の名前がわかりません。
 もしご存知の方がいれば、教えてください。

以下、Silverlightのプログラムです。Solveボタンを押すと解が表示されます。
実は、解は2つあるのですが、1つしか表示してません。もうひとつの解は、皆さんご自身で見つけてください。

Triangle15パズルは、他の同様のパズルと同じく、バックトラッキングによって解を見つけています。
データをどのよに表現するかが問題になりますが。ここでは、三角形を以下のように変形させています。
○○○○○
○○○○
○○○
○○

かつ、これを一次元のList<int>で表現し、C#のインデクサの機能を使い、2次元配列のようにアクセスできるようにしています。
例えば、this[0,0]は、一番左上の○を示し、this[1,3]は、2段目の一番右の○を示します。

解を求める方法ですが、まず一番上の5つの○に数字を入れます。1段目の数字が決まれば、残りの段の○は引き算をして埋めていくことができます。これで得られた15個の数字が、1-15で成り立っているかを調べています。
つまり、1~15の中から5つを選ぶ順列と同じことになります。
純粋に順列だけをを求めるコードはこちらに掲載しています。

C#のコードは、2段からn段まで対応できるようにしていますが、6段以上の三角形で解を求めようとするとかなりの時間がかかります。
LINQを駆使しているので、LINQに慣れていない方は分かりにくいかもしれませんが、是非ソースコードを読んでみてください。

以下、C#+Silverlightのコードです。Solver.csは、Silverlightに依存していません。
XAMLでのEllipseとTextBlockの配置がかなり力技であるのは、笑って許してください。

■Solver.cs
 
■MainPage.xaml.cs

■MainPage.xaml