第1講 数字の規則的な配置
第3話 検証Functionプロシージャkensyouを付け加える
を実現するプログラム例
Private Sub CommandButton1_Click()
CommandButton2_Click
Dim m As Integer, n As Integer, h As Integer, i As Integer
Dim y As Integer, x As Integer
Dim a(81) As Integer
m = Cells(1, 2)
n = Cells(2, 2)
h = Cells(3, 2)
For i = 0 To n - 1
y = Int(i / 10)
x = i Mod 10
a(i) = (h + i * m) Mod n
Cells(5 + y, 2 * x + 1) = a(i)
If i < n - 1 Then Cells(5 + y, 2 * x + 2) = "→"
Next
If kensyou(a, n) = 1 Then
Cells(4, 2) = "すべての数字が網羅されています。"
Else
Cells(4, 2) = "一部の数字しか入っていません。"
End If
End Sub
Function kensyou(a() As Integer, n As Integer)
Dim b(81) As Byte, i As Integer
For i = 0 To n - 1
b(i) = 0
Next
For i = 0 To n - 1
b(a(i)) = 1
Next
For i = 0 To n - 1
If b(i) = 0 Then
kensyou = 0
Exit Function
End If
Next
kensyou = 1
End Function
Private Sub CommandButton2_Click()
Rows("4:2000").Select
Selection.ClearContents
Range("A1").Select
End Sub
参考ダウンロード添付ファイル
解説
この検証Functionプロシージャkensyouは数独(ナンプレ)作成ソフトを作る上でとても大切です。
開発しようとしているのは数独(ナンプレ)問題生成アプリですが、
今回は先に解答を作ってから、
解答の一部のみを示して、
問題とします。
なぜ、先に解答を作ってしまうかというと・・・・
数独(ナンプレ)問題作成には次の矛盾する2つの条件を見たさなければなりません。
@ 解答が存在する
A 別解がない
ヒント数を多くすると、例え数独(ナンプレ)のルールに従って数字を配置しても、
ほとんどの場合、答がない問題になってしまいます。
数学でいう解なしです。
数学では、解なしの問題も立派な問題ですが、
パズルの場合はそうはいきません。
答が必ずなければなりません。
また、答が1つしかないというのがパズルの条件です。
ヒント数を少なくすれば、解答の存在しない可能性は少なくなっていきますが、
今度は逆に別解が存在してしまう可能性が増えていきます。
ですから、先の@Aは矛盾する要求なのです。
今回作成したアプリは、初級者から中級者までのアプリですから、
ヒント数の多い問題も作れるようにしたいのです。
ですが、
@ 解答が存在する
の条件が作成を困難にします。
そこで、@の条件をクリアするために先に解答を作ってしまうわけです。
数独(ナンプレ)は、実は解答を作る方が問題を作る方より簡単なのです。
9×9なら0.01秒以内に作れてしまいます。
解答を作っても、同じ行・列・ブロックに数字の重複がないかをいちいち肉眼で調べるのでは大変です。
最終的には、25×25の数独(ナンプレ)も作るのですから。
重複がないことを証明するには、
すべての数字が網羅されていることを調べれば良いのです。
プログラミングにはミスは付きものです。
本当に意図した通りに動くのかを確認する作業は絶対に欠かすことは出来ません。
さて、第3話が長くなってしまいましたので、第4話で解説をすることにしましょう。
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入門へ
本サイトトップへ