第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 | |
0 | 1 | 15 | 9 | ・ | 2 |
1 | ・ | 7 | ・ | 8 | ・ |
2 | ・ | ・ | 13 | ・ | ・ |
3 | ・ | 20 | ・ | 19 | ・ |
4 | 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 | |
0 | 1 | 15 | 23 | ・ | 2 |
1 | ・ | 7 | ・ | 8 | ・ |
2 | ・ | ・ | 13 | ・ | ・ |
3 | ・ | 20 | ・ | 19 | ・ |
4 | 22 | ・ | ・ | ・ | 25 |
のときsa=24となり、初めて条件をクリアし
0 | 1 | 2 | 3 | 4 | |
0 | 1 | 15 | 23 | 24 | 2 |
1 | ・ | 7 | ・ | 8 | ・ |
2 | ・ | ・ | 13 | ・ | ・ |
3 | ・ | 20 | ・ | 19 | ・ |
4 | 22 | ・ | ・ | ・ | 25 |
の世界に行きます。
後半も同様ですので、解説を省略します。