第2講 再帰的呼び出しで魔方陣を作ろう!
第1話 基本的考え方
ここでは力で魔方陣を作ることを考えます。
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
例えば、上のセルに1から9まで入れるすべての場合を考え、
その中ですべての行合計、列合計、対角線合計
が15になるものを考えようと言うわけです。
すべての場合の数は、
9!=362,880通り。
そのすべてを調べてしまおうというわけです。
4次魔方陣だと
16!=20,922,789,888,000通りと多くなりますが、
今のパソコンの性能なら数時間ぐらいで全部見つけてしまいます。
この方法はかなり強引な力業ですが、
番号の付け方を工夫するだけでかなり速くなり、
4次魔方陣なら数分ですべて見つけられるようになります。
そして、次数が高くなればその効果が大きく6次あたりではおそらく10万倍ほど速くなり、
6次でも1分に5,6個は作れるようになります。
番号の取り付け方の工夫は第3講で予定しています。
さらに高速化したり次数を高くするには様々な工夫が必要です。
第6講以降の講義でいろいろな工夫に取り組みます。
現在の最高速版なら18次魔方陣あたりでも1秒で100個ぐらい作成してしまいます。
すべての場合の数は
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
0から8まで(順列のときはわかりやすさを
優先して位置番号を1から始めましたが
応用講義では0からとします。)
をそれぞれのセルに1から9までの数字を入れて異なるセルに同じ数字が入らないようにします。
これは、結局1から9までの順列の作り方と同じになります。
したがって、基礎講義の第11講の順列の作り方が参考になります。
再帰的呼び出しによる順列の作成を参照しながら作ることにしましょう。
再帰的呼び出しによる順列の作成の
Sub jyunretusakusei(g As Integer)
のgの相当するのが、上の表の番号(セル位置番号)に当たります。
これからプログラムを考えていきますが、
セルの位置を示す番号とセルの中に入る数字を明確に区別してください。
1つずれているとはいえ同じような数字なのでうっかりすると混乱し、
訳がわからなくなるからです。
最初の問題は、g(セル位置番号)と
ij | 0 | 1 | 2 |
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
ピンクと赤を添え字する2次元配列とどう対応させるかです。
mah(i,j)としたとき、gとi、jをどう対応させるかと言うことです。