第4講 残確定法によるさらなる高速化
第3話 プログラム解説その1
If g = n - 1 Then
wa = 0
For k = 0 To n - 2
wa = wa + mah(k, k)
Next
hhh = 0
sa = Int(n * (n * n + 1) / 2) - wa
If sa < 1 Or sa > n * n Then GoTo owari1
If tyouhukuhantei(sa - 1) = 1 Then GoTo owari1
mah(i, j) = sa
tyouhukuhantei(sa - 1) = 1
hhh = 1
sakusei (g + 1)
GoTo owari1
End If
上の部分は、
0 | 1 | 2 | 3 | |
0 | 1 | ・ | ・ | ・ |
1 | ・ | 4 | ・ | ・ |
2 | ・ | ・ | 13 | ・ |
3 | ・ | ・ | ・ | ・ |
のピンクの部分を作っています。
wa = 0
For k = 0 To n - 2
wa = wa + mah(k, k)
Next
で(n-2,n-2)までの対角線合計が計算されます。
この例だとwa = 18となります。
次のsa = Int(n * (n * n + 1) / 2) - waの計算で、
sa = 16となります。
この場合は、If sa < 1 Or sa > n * n Then GoTo owari1
の試験を通過し次の行にいけます。
0 | 1 | 2 | 3 | |
0 | 1 | ・ | ・ | ・ |
1 | ・ | 4 | ・ | ・ |
2 | ・ | ・ | 5 | ・ |
3 | ・ | ・ | ・ | ・ |
例えば、上の場合はwa = 10となってしまい、
sa = 24となりIf sa < 1 Or sa > n * n Then GoTo owari1の条件に不合格となり、
owari1に飛んでしまい、ループ文は実施されません。
4次魔方陣に入れることができる数字は16までであるから、
この条件が課されます。また、
0 | 1 | 2 | 3 | |
0 | 8 | ・ | ・ | ・ |
1 | ・ | 12 | ・ | ・ |
2 | ・ | ・ | 16 | ・ |
3 | ・ | ・ | ・ | ・ |
の場合は、wa = 36、sa = -2でやはりowari1に飛び、
ループ文が実施されずg−1の世界(すなわち座標(2,2))に戻ります。
この場合座標(3,3)に何を入れても34することができないので、
gの世界(すなわち座標(3,3))ではどうすることもできないので、
1つ手前の世界座標(2,2)に戻って入れ直すわけです。処理は繰り返され、
0 | 1 | 2 | 3 | |
0 | 8 | ・ | ・ | ・ |
1 | ・ | 12 | ・ | ・ |
2 | ・ | ・ | 13 | ・ |
3 | ・ | ・ | ・ | ・ |
そして、座標(2,2)に13以下の数字が入った場合のみに
wa = 33、sa = 1などとなって合格できます。
合格した場合、
If tyouhukuhantei(sa - 1) = 1 Then GoTo owari1で次の試験が科されます。
例えば、1はすでにセル上に埋められていないか調べるわけです。
1が使われている場合1は重複しますので、不合格となるわけです。
上の例の場合は、1は使われていないため合格し
mah(i, j) = sa
tyouhukuhantei(sa - 1) = 1
が実行され、座標(3,3)に初めて1が入れられます。
そして、次の世界
0 | 1 | 2 | 3 | |
0 | 8 | ・ | ・ | ・ |
1 | ・ | 12 | ・ | ・ |
2 | ・ | ・ | 13 | ・ |
3 | ・ | ・ | ・ | 1 |
に入ります。さて、最後の
owari1:
If hhh = 1 Then tyouhukuhantei(sa - 1) = 0
はどういう意味でしょうか。
0 | 1 | 2 | 3 | |
0 | 8 | ・ | ・ | ・ |
1 | ・ | 12 | ・ | ・ |
2 | ・ | ・ | 13 | ・ |
3 | ・ | ・ | ・ | 1 |
から
0 | 1 | 2 | 3 | |
0 | 8 | ・ | ・ | ・ |
1 | ・ | 12 | ・ | ・ |
2 | ・ | ・ | 13 | ・ |
3 | ・ | ・ | ・ | ・ |
の世界に戻るとき、1は捨てられるので
1が使用されている状態tyouhukuhantei(1 - 1) = 1
をキャンセルしてtyouhukuhantei(1 - 1) = 0によって、
1は使用されていない状態ということになります。