n×n 個の正方形の方陣に数字を配置し、縦・横・対角線のすべての列でその列の数の合計が同じになるものを魔方陣といいます。今回はC#で魔方陣をつくります。

まず3×3の魔方陣について。1~9までの整数で順列をつくり、縦横斜めが同じになるかどうかを調べます。1~9までの総和と縦3列の総和は同じなので、1~9までの総和 / 3 = 15が各列の合計となります。

まずは順列をつくります。

次に魔方陣になっているかどうか調べるメソッドを示します。

GetResult()は処理の結果を取得するメソッドです。

この方法は時間がかかります。横列がそろうときに入れることができる数字は決まっているので、それ以外の順列は考えないことにします。これだとすぐに結果が表示されます。

これで4×4の魔方陣もできるのかと思ったらそうはいかないようです。場合の数が多すぎて途中で処理が止まってしまいます。

数字を入れたときに縦列が残り1つになっている場合、そこに入れることができる数字が存在しない場合は除外して考えると計算量が少なくなります。

作業用リストの要素がそれくらいになるか記憶しておくようにしました。

実行しようとすると2~3分かかります。出力結果はこうなりました。

880種類

16
240
3,360
2,064
24,768
272,448
2,724,480
1,238,400
2,793,888
5,180,480
7,563,568
958,880
756,640
657,464
549,504
549,504

1, 2, 15, 16, 12, 14, 3, 5, 13, 7, 10, 4, 8, 11, 6, 9
1, 2, 15, 16, 13, 14, 3, 4, 12, 7, 10, 5, 8, 11, 6, 9
// 以下省略

以下の動画によると5×5だと275,305,224通り、6×6に至っては不明です。スーパーコンピューターを使った予想では1800京通り(1京は1億の1億倍)とのこと。絶対にムリ(汗)

また奇数であれば簡単につくる方法があります。

魔方陣の解法、ヒンズーの連続方式 – 浄土真宗の学び場、法雷窟