忙中閑話

四季の移ろい、花鳥風月を楽しみつつ
趣味はミニチュア木工、電子工作、旅行など

閑話・・・数字パズル、数独をVBAマクロで解く

2012-06-04 | 日記
 いわゆるコンピュータゲームはあまり好きではないが、マインスィーパー(地雷ゲーム)やgooの数字パズルのようにルールが単純で推理が複雑なゲームはいい。地雷ゲームなどはハイスコアー(最短時間)を更新しようとするあまり時折のめりこんでしまうことがある。地雷の在り処を最後までマークしないまま推理していく方法をとっているので余計に頭を使う。

 数字パズルの方はハイスコアーの記録が残らないので記録更新のワクワク感がないが10分間の時間制限を超えるとゲームオーバーとなってしまう。たまに残り1枚でゲームオーバーということもありこんな時は非常に悔しい思いをする。

 購読している朝日新聞の土曜版にも「数独」という数字パズルが出題されていて問題と前週の回答が掲載されるので毎週土曜日を楽しみにしている。
こちらの方は時間制限がない代わり難易度に5段階ある。
ルールは至極簡単。9x9の升目があり、縦一列、横一列、および3x3のブロックで1~9の数字を重複しないように入れてゆく。
あまりの単純さにVBAマクロで解答プログラムを組んでみた。


※プログラム(部分)


まず、数字が不明の欄に”123456789”をいれて置き、数字が判っている欄の縦1列、横1列、該当ブロックからその数字を消してゆく。たとえば3列目の4行目が”5”だとすると3列目すべての欄、4行目すべての欄、および1列目の4行目から3列目の6行目にかけたブロックすべての欄から”5”を消す。

この操作を数字が判っているすべての欄で繰り返す。

この操作が終わったら縦1列、横1列、該当ブロックごとに1個しかない数字を探し出す。これが解答の数字。

新たに数字が判ればまた前の操作でやったようにその数字を縦、横、ブロックごとにで消してゆく。


※実例 (6/2付け朝日の問題で)

問題のデータを投入。1個づつ丁寧に投入する。
 

スタートをクリックしてプログラムを起動するとあっという間に解答が出る(この問題では約3秒)
  



 この問題は難易度5のうちの3番目。このプログラムでは難易度4まではまず解ける。難易度5の問題はもう一工夫必要だ、たとえば2と5の組み合わせが縦、横、ブロックのいずれかに2箇所しかないとその2箇所が2か5ということになり、その2箇所の欄以外は2あるいは5が消せる。簡単だがプログラム化するとなると非常に難しい。

人間ならこの見分けを難なくやれる。コンピュータの性能アップは目覚しいが、こうして人間の判断をプログラム化しようとすると改めて人間の能力のすごさを感じられずにはいられない。



最新の画像もっと見る

コメントを投稿