第8講 数独(ナンプレ)作成アプリVer.3に3on3確定と排除を組み込む
第6話 例外規定コード例
xs(0) = 1, xs(1) = 4, xs(2) = 5
xs1(0) = 1, xs1(1) = 4, xs1(2) = 5
xs2(0) = 1, xs2(1) = 4, xs2(1) = 5
のケースと
xs(0) = 1, xs(1) = 4, xs(2) = 5
xs1(0) = 1, xs1(1) = 4, xs1(2) = 5
xs2(0) = 1, xs2(1) = 4
のケースと
xs(0) = 1, xs(1) = 4, xs(2) = 5
xs1(0) = 1, xs1(1) = 4, xs1(2) = 5
xs2(0) = 1       , xs2(1) = 5
のケースと
xs(0) = 1, xs(1) = 4, xs(2) = 5
xs1(0) = 1, xs1(1) = 4, xs1(2) = 5
       xs2(0) = 4, xs2(1) = 5
のケースの4ケースを包摂するコード例
Function rhk(g As Byte) 'ライン排除確定解析+相補確定解析プロシージャ
          ・
      If w = 3 Then 
'2on2解析の直後です。
        rhk = tontx(g, xs, j, i)
        'tontxは行についての3on3解析を行うプロシージャ
        'i + 1は、数独配列p(○, ○)に入力する内容(1から9の値)であったことをお忘れなきように!
        Exit Function
      End If
          ・
End 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 + 1 は3on3セルの3番目のリスト候補
          If
・・・ 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確定による破綻処理
                             ・

一部コードを隠しました。
4つのケースを包摂するには、
(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))
とすれば良いのです。

一部のコードを隠したのは、
セルが同じくなるパターン以外に、
もう一つ解決しなければならない課題があるからです。
相補確定解析の
      If w = 2 Then '以下相補確定解析のための手続き
        
For k = i + 1 To n_1
          w = 0
          For l = 0 To n_1
            ls = Int(l / rn)
            la = l Mod rn
            If p(ybs + ls, xbs + la) = 0 Then
              If kh(ybs + ls, xbs + la, k) = 1 Then
                xs1(w) = xbs + la
                ys1(w) = ybs + ls
                w = w + 1
              End If
            End If
          Next
          If w = 2 And (xs(0) = xs1(0) And ys(0) = ys1(0)) And (xs(1) = xs1(1) And ys(1) = ys1(1)) Then
            For l = 0 To n_1  '以下相補確定破綻解析
              ls = Int(l / rn)
              la = l Mod rn
              If (xbs + la <> xs(0) Or ybs + ls <> ys(0)) And (xbs + la <> xs(1) Or ybs + ls <> ys(1)) Then
                         ・
のように進めるわけにはいかない部分があります。
それは何でしょうか。
ヒントは、For k = i + 1 To n_1にあります。



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