第8講 数独(ナンプレ)作成アプリVer.3に3on3確定と排除を組み込む
第8話 行の3on3解析を行うFunctionプロシージャコード例
Function tontx(g As Byte, xs() As Byte, s As Byte, ny As Byte) '行についての3on3解析を行うFunctionプロシージャ
'引数のnyは、内容(naiyou)の略、呼び出し側のライン排除確定プロシージャのiに当たる。
'i + 1は、数独配列p(○, ○)に入力する内容(1から9の値)であった。
'確定法で解く=仮定法を使わないので復元規定は最初から記述しない。
  Dim i As Byte, j As Byte, k As Byte, l As Byte, m As Byte, o As Byte, w As Byte
  Dim xs1(8) As Byte 'x座標を記録する変数
  Dim xs2(8) As Byte 'x座標を記録する変数
  tontx = 1
  For i = ny + 1 To n_1
  'i + 1 は数独配列p(○, ○)に入れる2番目の内容(1から9の値)
  'もっと正確に説明すると、3on3のセルにおけるリストの2番目となる可能性のある値である。
  '可能性という言い方をしたのは、以下の条件を満たしてはじめて2番目のリストになるから。
    w = 0
    For j = 0 To n_1 'jはx座標(横座標)
      If p(s, j) = 0 Then 's = ys(0)
        If kh(s, j, i) = 1 Then
          xs1(w) = j
          w = w + 1
        End If
      End If
    Next
    If w = 3 Then
      If xs(0) = xs1(0) And xs(1) = xs1(1) And xs(2) = xs1(2) Then
        For j = 0 To n_1 'j + 1 は3on3セルの3番目のリスト候補
          If j <> ny And j <> i Then
            w = 0
            For k = 0 To n_1 'kはx座標(横座標)
              If p(s, k) = 0 Then 's = ys(0)
                If kh(s, k, j) = 1 Then
                  xs2(w) = k
                  w = w + 1
                End If
              End If
            Next
            If w = 2 Or w = 3 Then
              If (xs2(0) = xs(0) And xs2(1) = xs(1)) Or (xs2(0) = xs(0) And xs2(2) = xs(2)) Or (xs2(1) = xs(1) And xs2(2) = xs(2)) Then
                '以降3on3確定による破綻処理
                For k = 0 To n_1
                  If k <> xs(0) And k <> xs(1) And k <> xs(2) Then
                    If p(s, k) = 0 Then
                      If mx(s, k) = 2 Then
                        w = 0
                        For l = 0 To 2
                          If rlst(s, k, l) = ny + 1 Or rlst(s, k, l) = i + 1 Or rlst(s, k, l) = j + 1 Then
                            w = w + 1
                          End If
                        Next
                        If w = 3 Then
                          tontx = 0
                          Exit Function
                        End If
                      End If
                      If mx(s, k) = 1 Then
                        w = 0
                        For l = 0 To 1
                          If rlst(s, k, l) = ny + 1 Or rlst(s, k, l) = i + 1 Or rlst(s, k, l) = j + 1 Then
                            w = w + 1
                          End If
                        Next
                        If w = 2 Then
                          tontx = 0
                          Exit Function
                        End If
                      End If
                      If mx(s, k) = 0 Then
                        If rlst(s, k, 0) = ny + 1 Or rlst(s, k, 0) = i + 1 Or rlst(s, k, 0) = j + 1 Then
                          tontx = 0
                          Exit Function
                        End If
                      End If
                    End If
                  End If
                Next
                '3on3確定による破綻処理終了
'                Cells(4 + Int(cnt / 50), 1 + (cnt Mod 50)) = "X"
'                cnt = cnt + 1
                '以降3on3確定による排除解析
                For k = 0 To n_1
                  If k <> xs(0) And k <> xs(1) And k <> xs(2) Then
                    If p(s, k) = 0 Then
                      For l = 0 To mx(s, k)
                        If ny + 1 = rlst(s, k, l) Then
                          rlst(s, k, l) = rlst(s, k, mx(s, k))
                          rlst(s, k, mx(s, k)) = ny + 1
                          kh(s, k, ny) = 0
                          mx(s, k) = mx(s, k) - 1
                          Exit For
                        End If
                      Next
                      For l = 0 To mx(s, k)
                        If i + 1 = rlst(s, k, l) Then
                          rlst(s, k, l) = rlst(s, k, mx(s, k))
                          rlst(s, k, mx(s, k)) = i + 1
                          kh(s, k, i) = 0
                          mx(s, k) = mx(s, k) - 1
                          Exit For
                        End If
                      Next
                      For l = 0 To mx(s, k)
                        If j + 1 = rlst(s, k, l) Then
                          rlst(s, k, l) = rlst(s, k, mx(s, k))
                          rlst(s, k, mx(s, k)) = j + 1
                          kh(s, k, j) = 0
                          mx(s, k) = mx(s, k) - 1
                          Exit For
                        End If
                      Next
                    End If
                  End If
                Next
                '3on3確定による排除解析終了
                '以降3on3確定解析
                Dim kr(2) As Byte
                For k = 0 To 2
                  kr(k) = 0
                Next
                w = 0
                For k = 0 To mx(s, xs(0))
                  If ny + 1 = rlst(s, xs(0), k) Then
                    kr(0) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                For k = 0 To mx(s, xs(0))
                  If i + 1 = rlst(s, xs(0), k) Then
                    kr(1) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                For k = 0 To mx(s, xs(0))
                  If j + 1 = rlst(s, xs(0), k) Then
                    kr(2) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                If w = 3 Then
                  rlst(s, xs(0), 0) = ny + 1
                  rlst(s, xs(0), 1) = i + 1
                  rlst(s, xs(0), 2) = j + 1
                  mx(s, xs(0)) = 2
                End If
                If w = 2 Then
                  w = 0
                  If kr(0) = 1 Then
                    rlst(s, xs(0), w) = ny + 1
                    w = w + 1
                  End If
                  If kr(1) = 1 Then
                    rlst(s, xs(0), w) = i + 1
                    w = w + 1
                  End If
                  If kr(2) = 1 Then
                    rlst(s, xs(0), w) = j + 1
                    w = w + 1
                  End If
                  mx(s, xs(0)) = 1
                End If
                For k = 0 To 2
                  kr(k) = 0
                Next
                w = 0
                For k = 0 To mx(s, xs(1))
                  If ny + 1 = rlst(s, xs(1), k) Then
                    kr(0) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                For k = 0 To mx(s, xs(1))
                  If i + 1 = rlst(s, xs(1), k) Then
                    kr(1) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                For k = 0 To mx(s, xs(1))
                  If j + 1 = rlst(s, xs(1), k) Then
                    kr(2) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                If w = 3 Then
                  rlst(s, xs(1), 0) = ny + 1
                  rlst(s, xs(1), 1) = i + 1
                  rlst(s, xs(1), 2) = j + 1
                  mx(s, xs(1)) = 2
                End If
                If w = 2 Then
                  w = 0
                  If kr(0) = 1 Then
                    rlst(s, xs(1), w) = ny + 1
                    w = w + 1
                  End If
                  If kr(1) = 1 Then
                    rlst(s, xs(1), w) = i + 1
                    w = w + 1
                  End If
                  If kr(2) = 1 Then
                    rlst(s, xs(1), w) = j + 1
                    w = w + 1
                  End If
                  mx(s, xs(1)) = 1
                End If
                For k = 0 To 2
                  kr(k) = 0
                Next
                w = 0
                For k = 0 To mx(s, xs(2))
                  If ny + 1 = rlst(s, xs(2), k) Then
                    kr(0) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                For k = 0 To mx(s, xs(2))
                  If i + 1 = rlst(s, xs(2), k) Then
                    kr(1) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                For k = 0 To mx(s, xs(2))
                  If j + 1 = rlst(s, xs(2), k) Then
                    kr(2) = 1
                    w = w + 1
                    Exit For
                  End If
                Next
                If w = 3 Then
                  rlst(s, xs(2), 0) = ny + 1
                  rlst(s, xs(2), 1) = i + 1
                  rlst(s, xs(2), 2) = j + 1
                  mx(s, xs(2)) = 2
                End If
                If w = 2 Then
                  w = 0
                  If kr(0) = 1 Then
                    rlst(s, xs(2), w) = ny + 1
                    w = w + 1
                  End If
                  If kr(1) = 1 Then
                    rlst(s, xs(2), w) = i + 1
                    w = w + 1
                  End If
                  If kr(2) = 1 Then
                    rlst(s, xs(2), w) = j + 1
                    w = w + 1
                  End If
                  mx(s, xs(2)) = 1
                End If
                '3on3確定解析終了
                Exit For
              End If
            End If
          End If
        Next
      End If
    End If
  Next
End Function

テキスト形式の添付ファイル
面倒な場合には添付ファイルをコピペして使って下さい。
自分でタイプしなければプログラミングが上達しないなどの考えは、
迷信です。
大事なことは理解することです。
もっともVBAの場合には、添付ファイルを使わずに、
このページを直接コピペしても問題を起こさないようにはなっています。
全角スペースを挿入してもエラーしない設計になっているからです。
他の言語もこの点は是非とも学んで頂きたいと思います。
VBやVBAを小馬鹿にする方もいらっしゃいますが、
私は、JavaよりVBAを高く評価しています。
エクセルやワードと直結していて、
高度なアプリが誰にでも簡単に作れるからです。
もっとも好きな言語を挙げなさいといわれれば、
迷わずC++とVBAを挙げます。




さて、次は列の3on3解析を行うFunctionプロシージャ
のコーティングです。
皆さん、頑張りましょう。
tontxのコードをコピペして、
編集の置換において、
カレント プロシージャ内で「すべて置換」するを使って効率的に、
コーティングしてください。






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