第4講 残確定法によるさらなる高速化
第5話 プログラム解説その2

今回は下の記述の説明です。
If i = 0 And j = n - 2 Then
  wa = 0
  For k = 0 To n - 3
    wa = wa + mah(i, k)
  Next
  wa = wa + mah(i, n - 1)
  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
If i = n - 2 And j = 0 Then
  wa = 0
  For k = 0 To n - 3
    wa = wa + mah(k, j)
  Next
  wa = wa + mah(n - 1, j)
  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

今日はn = 5を例にとって説明しましょう。
i = 0 And j = n - 2

 0  1  2  3  4
 1 15  9  ・  2
 ・  7  ・  8  ・
 ・  ・ 13  ・  ・
 ・ 20  ・ 19  ・
22  ・  ・  ・ 25

ピンクの場所を表しています。
  wa = 0
  For k = 0 To n - 3
    wa = wa + mah(i, k)
  Next
  wa = wa + mah(i, n - 1)
  hhh = 0
  sa = Int(n * (n * n + 1) / 2) - wa

の計算でsa=38になりますが、当然これは
  If sa < 1 Or sa > n * n Then GoTo owari1
をクリアできず、前の世界に戻ります。
何回か同様なことを繰り返し

 0  1  2  3  4
 1 15 23  ・  2
 ・  7  ・  8  ・
 ・  ・ 13  ・  ・
 ・ 20  ・ 19  ・
22  ・  ・  ・ 25

のときsa=24となり、初めて条件をクリアし

 0  1  2  3  4
 1 15 23 24  2
 ・  7  ・  8  ・
 ・  ・ 13  ・  ・
 ・ 20  ・ 19  ・
22  ・  ・  ・ 25

の世界に行きます。
後半も同様ですので、解説を省略します。


第4講第4話へ
 第4講第6話へ


VB講義応用編トップへ

VB講義トップへ