第8講 配列の学習
第9話 最も簡単な数独-2行2列1ブロック数独


2行2列1ブロックその12行2列1ブロックその2
コード例
Private Sub CommandButton1_Click()
  Dim i As Byte, j As Byte, k As Byte, a(1, 1) As Byte, h As Byte
  For i = 0 To 1
    For j = 0 To 1
      a(i, j) = Int(2 * Rnd) + 1
      h = 1
      If j > 0 Then
        For k = 0 To j - 1
          If a(i, k) = a(i, j) Then
            j = j - 1
            h = 0
          End If
        Next
      End If
      If h = 1 Then
        If i > 0 Then
          For k = 0 To i - 1
            If a(k, j) = a(i, j) Then
              i = i - 1
              h = 0
            End If
          Next
        End If
      End If
    Next
  Next
  For i = 0 To 1
    For j = 0 To 1
      Cells(5 + i, 2 + j) = a(i, j)
    Next
  Next
End Sub
参考ファイル1

今回のコードは
  Dim i As Byte, j As Byte, k As Byte, a(
1, 1) As Byte, h As Byte
  For i = 0 To
1
    For j = 0 To
1
      a(i, j) = Int(
2 * Rnd) + 1
色の付いている部分12をそれぞれ23に変更すれば、
3行3列1ブロック数独になります。
数独(ただし、罫線はエクセルから手で入れてあります。)
参考ファイル2

また、それぞれ34に変更すれば、
4行4列1ブロック数独になります。
魔方陣
参考ファイル3

さらに、
Private Sub CommandButton1_Click()
  Dim i As Byte, j As Byte, k As Byte, a(10, 10) As Byte, h As Byte, n As Byte
  n = Cells(5, 12)
  For i = 0 To n - 1
    For j = 0 To n - 1
      a(i, j) = Int(n * Rnd) + 1
      h = 1
      If j > 0 Then
        For k = 0 To j - 1
          If a(i, k) = a(i, j) Then
            j = j - 1
            h = 0
          End If
        Next
      End If
      If h = 1 Then
        If i > 0 Then
          For k = 0 To i - 1
            If a(k, j) = a(i, j) Then
              i = i - 1
              h = 0
            End If
          Next
        End If
      End If
    Next
  Next
  For i = 0 To n - 1
    For j = 0 To n - 1
      Cells(7 + i, 2 + j) = a(i, j)
    Next
  Next
End Sub
と改良してシートを若干いじれば
VBA入門
と一般化できます。
参考ファイル4
これで実験すると分かりますが、数秒以内でできるのはn=4までで
n=5だと10分以上待っても結果が出力されません。
5行5列でこうですから、9行9列では歯が立ちません。
まして、そこへブロックの条件を入れたら、
永久に答えが出ないことがお分かりになると思います。

ところで、n=5だとプログラムが正常に動いているか分かりません。
そこで、次話において動きが分かるようにコードを変更してみましょう。





8話へ 第10話へ


トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ