第6講 数独作成アプリVer.1にライン排除確定を組み込む
第5話 ライン排除確定プロシージャを作るためのヒント
1から9までのすべての数字について
のようになっているセルはないかを調べます。
視覚を持っているわれわれにとって、
赤いセルが確定できるセルであることを発見することは、
簡単ですが、
視覚のないソフトにこれを認識させることは大変に困難です。
本当は、もっと上手い方法があるのかも知れませんが、
私がとった方法は、
数字1,2,3,4,5,6,7,8,9のそれぞれについて
すべての行、すべての列、すべてのブロックの中で、
入力可となるセルが一カ所しかないものがあるか調べました。
具体的には、
すべての行について注目する数字に対応する色が塗られていないセルをカウントして、
色のついていないセル個数が1個のときに、
そのセルに対応するリスト構造を
{1,2,3,4,5,6,7,8,9},mx(i, j) = 0
とするのです。
図の場合ならmx(i, j) = 0はmx(0, 2) = 0
です。
列やブロックについても同様なことをします。
数字が入力される度に、
このような手順を踏むと重複して解析してしまう可能性がありますので、
もし、いずれかの行、いずれかの列、いずれかのブロックで
白の個数が1になっているものを発見したら、
その段階で強制的にライン排除確定プロシージャを抜けるようにしたのです。
確定できるセルが見つかったら、
そのセルに数字を入れていく・・・
これは数独=ナンプレを解くときのセオリー=定跡=定石です。
だから、見つかったらすぐに入れてしまうのです。
尚、各数字に対応する各行または各列または各ブロックの白の個数のカウントは、
Function rhk() 'ライン排除確定解析プロシージャ
Dim i As Byte, j As Byte, k As Byte, w As Byte 'wは行・列・ブロックにおける白の個数を数えるカウンタ
Dim ys As Byte 'y座標を記録する変数
Dim xs As Byte 'x座標を記録する変数
'以下各数字に対応する行におけるライン排除確定があるかを調べるための手順
For i = 0 To n_1 'i + 1 は入力する数字を示す。
For j = 0 To n_1 'jはy座標(縦座標)
w = 0
'以下行における白のセルのカウント
For k = 0 To n_1 'kはx座標(横座標)
・
・
・
End Function
のように3次元For文になることを付け加えておきます。
さらに、i,j,kの役割はプログラマーが決めればよいのであって、
上の記述は1つの例に過ぎません。
ここで皆さんにプログラミングに入って頂きたいところですが、
まだ越えなければならない山があります。
それは復元です。
復元の考え方を次話で説明しましょう。
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入門へ
本サイトトップへ