第16講 全セルリスト構造解析(全体リスト構造解析)によって数独(ナンプレ)を解く
第11話 数字を入れる度に全体構造解析=全セルリスト構造解析を繰り返すと?
プログラムのSub f(g As Byte)の部分を次のように変更して実験してみましょう。
Sub f(g As Byte)
Dim i As Byte, j As Byte, k As Byte
Dim y As Byte, x As Byte
y = Int(g / 9)
x = g Mod 9
If mah(y, x) > 0 Then
If g + 1 < 81 Then
f (g + 1)
If cn = 1 Then Exit Sub
Else
cn = cn + 1
hyouji
If cn = 1 Then Exit Sub (2014/12/07に訂正)
End If
Exit Sub
End If
If mah(y, x) = 0 Then
If mx(y, x) = 0 Then Exit Sub
For i = 0 To mx(y, x) - 1
mah(y, x) = lst(y, x, i)
' For j = 0 To 8
' If j <> x Then
' If mah(y, x) = mah(y, j) Then GoTo tobi
' End If
' Next
' For j = 0 To 8
' If j <> y Then
' If mah(y, x) = mah(j, x) Then GoTo tobi
' End If
' Next
' For k = 0 To 2
' For l = 0 To 2
' If y <> 3 * Int(y / 3) + k And x <> 3 * Int(x / 3) + l Then
' If mah(y, x) = mah(3 * Int(y / 3) + k, 3 * Int(x / 3) + l) Then GoTo tobi
' End If
' Next
' Next
If g + 1 < 81 Then
syokika
For j = 0 To 8
For k = 0 To 8
If mah(j, k) = 0 Then
Call cellkaiseki1(j, k)
Call cellkaiseki2(j, k)
End If
Next
Next
f (g + 1)
If cn = 1 Then Exit Sub
Else
cn = cn + 1
hyouji
If cn = 1 Then Exit Sub
mah(y, x) = 0
syokika
For j = 0 To 8
For k = 0 To 8
If mah(j, k) = 0 Then
Call cellkaiseki1(j, k)
Call cellkaiseki2(j, k)
End If
Next
Next
End If
'tobi:
Next
End If
mah(y, x) = 0
End Sub
参考ファイル
実験結果 問題
について
数字を入れる度に全体構造解析を繰り返した場合
繰り返さない場合
なんと改善されるどころか大幅に悪化しました。
確かに、全体構造解析を繰り返すと選択肢は減っていきますが、
全体構造解析に多大な時間がかかり、
速度が大幅に落ちてしまうのです。
では、全体構造解析を最初の数セルにとどめておいたらどうでしょうか。
プログラムを改善しましょう。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ