第4講 数独作成アプリVer.1開発その2
第3話 疑似疑似作成ソフトは何故エラーを起こす場合があるのか?
問題は、Sub klk(g As Integer)にあります。
この局所リスト解析プロシージャを改良しないと、
エラーを起こす場合があるという欠陥を改善できません。
いったい何が問題なのでしょうか。
第32講の第3話で出した事例
q
をみてください。赤に2を入れると破綻します。
理由は
f
緑のブロックには、2を入れるセルがなくなってしまいます。
どのブロックにもどの行にもどの列にも1から9までの数字を1つずつ入れる・・・
これが数独のルールですから、
赤いセルに2を入れたときに破綻するわけです。
(よく見るとこの図には他にも破綻している場所があるかも知れませんが、
あくまで説明のための図だと好意的に見て下さい。)
そもそも疑似疑似作成ソフト
は試行錯誤で問題を配置するソフトです。
ですから、最初から破綻を前提に考えられたソフトなのに、
破綻した場合の対策がされていない・・・
破綻しているのにそのままセルを進めれば、
d
j
とエラーしてしまうのです。
つまり、
Sub sds(g As Integer) '数独作成プロシージャ
  Dim i As Byte, ii As Byte, iii As Byte
  ii = Int(Rnd * mx(y(g), x(g)))
  For i = 0 To mx(y(g), x(g))
    iii = (i + ii) Mod (mx(y(g), x(g)) + 1)
    p(y(g), x(g)) = rlst(y(g), x(g), iii)
    klk (g) '局所リスト構造解析プロシージャ
    If g + 1 < hintosu Then
      sds (g + 1)
      If cn = 1 Then Exit Sub
    Else
      hyouji '問題表示プロシージャ
      cn = cn + 1
      Exit Sub
    End If
  Next
  p(y(g), x(g)) = 0
End Sub
Sub klk(g As Integer) '局所リスト構造解析プロシージャ
に問題があるのです。
今のままだと破綻していても
    If g + 1 < hintosu Then
      sds (g + 1)
      If cn = 1 Then Exit Sub
    Else
      hyouji '問題表示プロシージャ
      cn = cn + 1
      Exit Sub
    End If
によって、先のセルに進んでしまうのですから、
未来においてセルに入れる数字がない!!!
という事態が発生するのです。
問題解消は、
局所リスト解析プロシージャをSubプロシージャではなく、
Functionプロシージャにして、
破綻しているときは0を返し、破綻していない場合には1を返すようにして、
  For i = 0 To mx(y(g), x(g))
    iii = (i + ii) Mod (mx(y(g), x(g)) + 1)
    p(y(g), x(g)) = rlst(y(g), x(g), iii)
    
If klk(g) = 1 Then '局所リスト解析プロシージャ
      If g + 1 < hintosu Then
        sds (g + 1)
        If cn = 1 Then Exit Sub
      Else
        If g + 1 < n * n Then
          nck (g + 1)
          sds (g + 1)
          If cn = 1 Then Exit Sub
        Else
          hyouji '問題表示プロシージャ
          cn = cn + 1
          Exit Sub
        End If
      End If
    End If
    hukugen (g)
  Next
とすれば良いわけです。




第2話へ 第4話へ
004

eclipse c++ 入門
魔方陣 数独(ナンプレ)で学ぶ VBA 入門
数独(ナンプレ)のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ