第13講 プロシージャの再帰的使用による数独の自動生成
第4話 全体の座標番号をブロック内の座標番号に対応させるには?

0 1 2
3 4 5
6 7 8

正解は上図の

1 2
4 5

の部分と比較をすれば良いのです。
要するに、列と行の双方がずれるようにしてやれば良い訳です。
jとkの2次元For文だとすれば、
gi <> j and gj <> k
のように条件付けをすれば良いのです。

ブロックの重複チェックが難しい最後の理由は、
セル番号gに対応する

 
 0 0 1 2 3 4 5 6 7 8
 1 9 10 11 12 13 14 15 16 17
 2 18 19 20 21 22 23 24 25 26
 3 27 28 29 30 31 32 33 34 35
 4 36 37 38 39 40 41 42 43 44
 5 45 46 47 48 49 50 51 52 53
 6 54 55 56 57 58 59 60 61 62
 7 63 64 65 66 67 68 69 70 71
 8 72 73 74 75 76 77 78 79 80

全体の座標(gigj)と
と任意のブロック内のセル番号に対応するブロック内座標

 
 0 57 58 59
 1 66 67 68
 2 75 76 77

をどのように対応させるかです。
つまり、

 6
 7
 8


などをいかに

 0
 1
 2


へと翻訳するかです。
あるいは、その逆翻訳をどうするかです。

に翻訳させるにはどうしたよいでしょうか。
に翻訳させるにはどうしたよいでしょうか。
逆に、
に翻訳させるにはどうしたよいでしょうか。
に翻訳させるにはどうしたよいでしょうか。

Int()とModを上手く使います。
に翻訳させるには
7 Mod 3
です。3は1ブロック行毎に3ブロックあるからです。
7 Mod 3 は7を3で割った余りを計算させます。
すなわち、
7 Mod 3 =
1
です。
では、
に翻訳にはどうしたらよいでしょうか。
3 * Int(
7 / 3) + 1
(一般的には、
3 * Int(
gi / 3) + j
3 * Int(
gj / 3) + k
です。)

以上の考え方を示しても、
まだ、初心者にとって難しすぎると思いますので、
コードの1部を示しておきます。

If (gi Mod 3) > 0 Then
  For j = 0 To
(gi Mod 3) - 1
    For k = 0 To 2
      If gj <> 3 * Int(gj / 3) + k Then

これで列と行における重複チェックとの重複も避けられていますし、
2次元を1次元に対応させるという課題もクリアしています。
このページの最初の方で
gi <> j and gj <> k
と書きましたが、gi <> j の部分がいらないことはお分かりでしょう。

さあ、以上のヒントを参考に数独解答自動生成ソフトを
作成してみましょう。

第3話へ 第5話へ



トップ

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

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