第8講 配列の学習
第9話 最も簡単な数独-2行2列1ブロック数独
コード例
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
色の付いている部分1と2をそれぞれ2と3に変更すれば、
3行3列1ブロック数独になります。
(ただし、罫線はエクセルから手で入れてあります。)
参考ファイル2
また、それぞれ3と4に変更すれば、
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
と改良してシートを若干いじれば
と一般化できます。
参考ファイル4
これで実験すると分かりますが、数秒以内でできるのはn=4までで
n=5だと10分以上待っても結果が出力されません。
5行5列でこうですから、9行9列では歯が立ちません。
まして、そこへブロックの条件を入れたら、
永久に答えが出ないことがお分かりになると思います。
ところで、n=5だとプログラムが正常に動いているか分かりません。
そこで、次話において動きが分かるようにコードを変更してみましょう。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ