第8講 数独(ナンプレ)作成アプリVer.3に3on3確定と排除を組み込む
第1話 課題の困難性
3on3の研究は、困難を極めました。
2つが3つになるだけで、コードはかなり複雑になります。
それに加えて、3on3には特有の問題があります。
特有の問題は、何かと申し上げますと、
2on2すなわち相補確定は、本当の1:1対応であったのに対して、
例外が存在することです。
相補確定の場合には、2つのセルに対して2つの候補数字でした。
それに対して、3on3の場合には、1:1対応以外に

のような変則的なケースも可であるわけです。

もしこのような例外規定を考えなかったとしても、
3on3がなぜ難しいのでしょうか。
それは、2on2でさえ複雑であった入れ子式構造が、
更に一層付け加えられるからです。
数独(ナンプレ)自動作成アプリVer.3
等には明らかな失敗があります。
それは、ライン排除確定解析の中に、
すべてのコードを詰め込んでしまったことです。
ですから、2on2でさえ、
      If w = 2 Then '以下相補確定解析ための手続き
        For k = i + 1 To n_1
          w = 0
          For l = 0 To n_1
            If p(j, l) = 0 Then
              If kh(j, l, k) = 1 Then
                xs1(w) = l
                w = w + 1
              End If
            End If
          Next
          If w = 2 And xs(0) = xs1(0) And xs(1) = xs1(1) Then
            For l = 0 To n_1
              If l <> xs(0) And l <> xs(1) Then '以下相補確定による破綻解析
                   ・・・
              End If
            Next                '以上相補確定による破綻解析
            For l = 0 To n_1 '以下相補確定による排除解析
              If l <> xs(0) And l <> xs(1) Then
                If p(j, l) = 0 Then
                  For m = 0 To mx(j, l)
                    If rlst(j, l, m) = i + 1 Then
                       ・・・
                    End If
                    If rlst(j, l, m) = k + 1 Then
                       ・・・
                      Exit For
                    End If
                  Next
                End If
              End If
            Next        '以上相補確定による解除解析
            If hth(g, j, xs(0)) = 0 Then  '以下相補確定
               ・・・
            End If
            If hth(g, j, xs(1)) = 0 Then
               ・・・
            End If  '以上相補確定
'            sh(g) = 1
            Exit Function
          End If
        Next
      End If    '以上相補確定解析のための手続き
のような大変複雑なコードになっています。
もし、2on2の解析を行う部分を独立のプロシージャにしていたなら、
      If w = 2 Then
        rhk = tontx(g, xs, j, i)
        'tontxは行についての2on2解析を行うプロシージャ
        'i + 1は、数独配列p(○, ○)に入力する内容(1から9の値)であったことをお忘れなきように!
        Exit Function
      End If
と大変見通しのよいコードになっていました。
すべて詰め込んだためにコードの構造が見えにくくなっただけではなく、
プロシージャが大変巨大なものになってしまったという欠点も
付録としてついてきてしまった・・・のです。
なるべくプロシージャは小さくすることをお勧めしますと、
言っていた私が、大きな誤りを犯してしまいました。
本当に申し訳ありません。
皆さんを混乱に陥れてしまった責任は、
すべて私にあります。

皆さん、3on3解析は独立のプロシージャにして下さい。
しかも、
行について解析するプロシージャ
列について解析するプロシージャ
ブロックについて解析するプロシージャ
として下さい。
理由は、細かく分けても結構大きなプロシージャになるからです。
本当は白いセルのカウントを専門に行うプロシージャも作った方が、
良かったのかも知れません。
そうすれば尚、コードの構造は見やすいものになっていたでしょう。
皆さんは、私と同じ轍を踏まないで下さい。
出来るだけプロシージャを小さくして、
見通しの良いコードにして下さい。




第7講第7話へ 第2話へ
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入門へ
本サイトトップへ