第23講 数独を解くソフトの開発
第9話 Ver.2のコード解説その2
コード主要部分再掲
  For i = 0 To 8
    For j = 0 To 8
      If a(i, j) = 0 Then
        
For k = 0 To 8
          If k <> j And a(i, k) > 0 Then
            For l = 0 To 8
              If ls(i, j, l) = a(i, k) Then
                w = ls(i, j, m(i, j) - 1)
                ls(i, j, m(i, j) - 1) = a(i, k)
                ls(i, j, l) = w
                m(i, j) = m(i, j) - 1
                Exit For
              End If
            Next
          End If
        Next

        
For k = 0 To 8
          If k <> i And a(k, j) > 0 Then
            For l = 0 To m(i, j) - 1
              If ls(i, j, l) = a(k, j) Then
                w = ls(i, j, m(i, j) - 1)
                ls(i, j, m(i, j) - 1) = a(k, j)
                ls(i, j, l) = w
                m(i, j) = m(i, j) - 1
                Exit For
              End If
            Next
          End If
        Next

        For k = 0 To 8
          If i <> 3 * Int(i / 3) + Int(k / 3) And j <> 3 * Int(j / 3) + (k Mod 3) And a(3 * Int(i / 3) + Int(k / 3), 3 * Int(j / 3) + (k Mod 3)) > 0 Then
            For l = 0 To m(i, j) - 1
              If ls(i, j, l) = a(3 * Int(i / 3) + Int(k / 3), 3 * Int(j / 3) + (k Mod 3)) Then
                w = ls(i, j, m(i, j) - 1)
                ls(i, j, m(i, j) - 1) = a(3 * Int(i / 3) + Int(k / 3), 3 * Int(j / 3) + (k Mod 3))
                ls(i, j, l) = w
                m(i, j) = m(i, j) - 1
                Exit For
              End If
            Next
          End If
        Next
      End If
    Next
  Next


色を付けたそれぞれの部分の任務は、
ピンクがセルの行部分に布置されている数字の確認
図1(水色の部分)
ですし、
青色がセルの列部分に配置されている数字の確認
図2(オレンジの部分)
です。
濃茶がブロック部に置かれている数字の確認
図P(緑の部分)
です。
        For k = 0 To 8
          If
k <> j And a(i, k) > 0 Then
            
For l = 0 To 8
              If ls(i, j, l) = a(i, k) Then
                w = ls(i, j, m(i, j) - 1)
                ls(i, j, m(i, j) - 1) = a(i, k)
                ls(i, j, l) = w
                m(i, j) = m(i, j) - 1
                Exit For
              End If
            Next

          End If
        Next

によって動いているのは、
図3
水色の部分なのです。
赤が主人公であるのに対して、
水色は主人公に相対しているお客さんです。
あくまで解析は赤いセルの解析です。
赤いセルに入る数字の候補=リストの確認です。
というより、
1,2,3,4,5,6,7,8,9
の中から排除する対象を確認しているといった方がよいですね。
        For k = 0 To 8
によって行(横列)の中を動いていきますが、
          If
k <> j And a(i, k) > 0 Then
k <> j が赤のセル以外を動くように条件付けています。
さらに、
a(i, k) > 0
がありますから、実際に動くのは、
図4
数字の入っているセルだけ動きます。
さて、一番難関な
            For l = 0 To 8
              If ls(i, j, l) = a(i, k) Then
                w = ls(i, j, m(i, j) - 1)
                ls(i, j, m(i, j) - 1) = a(i, k)
                ls(i, j, l) = w
                m(i, j) = m(i, j) - 1
                Exit For
              End If
            Next

を解説しなければなりません。
皆さん何をしているか分かりますか。

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