第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
 1  ・  ・  ・
 ・  4  ・  ・
 ・  ・ 13  ・
   ・  ・  ・

のピンクの部分を作っています。
  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
 1  ・  ・  ・
 ・  4  ・  ・
 ・  ・  5  ・
   ・  ・  ・

例えば、上の場合はwa = 10となってしまい、
sa = 24となりIf sa < 1 Or sa > n * n Then GoTo owari1の条件に不合格となり、
owari1に飛んでしまい、ループ文は実施されません。
4次魔方陣に入れることができる数字は16までであるから、
この条件が課されます。また、

 0  1  2  3
 8  ・  ・  ・
 ・ 12  ・  ・
 ・  ・ 16  ・
   ・  ・  ・

の場合は、wa = 36、sa = -2でやはりowari1に飛び、
ループ文が実施されずg−1の世界(すなわち座標(2,2))に戻ります。
この場合座標(3,3)に何を入れても34することができないので、
gの世界(すなわち座標(3,3))ではどうすることもできないので、
1つ手前の世界座標(2,2)に戻って入れ直すわけです。処理は繰り返され、

 0  1  2  3
 8  ・  ・  ・
 ・ 12  ・  ・
 ・  ・ 13  ・
   ・  ・  ・

そして、座標(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
 8  ・  ・  ・
 ・ 12  ・  ・
 ・  ・ 13  ・
   ・  ・  1

に入ります。さて、最後の
owari1:
If hhh = 1 Then tyouhukuhantei(sa - 1) = 0
はどういう意味でしょうか。

 0  1  2  3
 8  ・  ・  ・
 ・ 12  ・  ・
 ・  ・ 13  ・
   ・  ・  1

から

 0  1  2  3
 8  ・  ・  ・
 ・ 12  ・  ・
 ・  ・ 13  ・
   ・  ・  ・

の世界に戻るとき、1は捨てられるので
1が使用されている状態tyouhukuhantei(1 - 1) = 1
をキャンセルしてtyouhukuhantei(1 - 1) = 0によって、
1は使用されていない状態ということになります。


第4講第2話へ
 第4講第4話へ


VB入門講義応用編トップへ

VB入門講義トップへ