プログラム解説第2話 数独パズル改良版(非ランダム版)の解説
(この解説ではわかりやすさを優先して、VB入門講義応用編
の第6講では0から番号付けしていたのに対して1つずらして1から始めています。)
数独パズル改良版(非ランダム版)は
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
番号1から81までのセルに1から9までの数字をいれて、すべての場合を調べるプログラムにです。
番号順にセルに数字を一つ一つ入れて、その度に数独のルールに反していないか調べます。
数独のルールというのは同じ行、同じ列、同じ小ブロックに同じ数字は入ってはいけないというものです。
ルールに違反している場合は、数字の入れ換えをルール通りになるまで続けます。
その番号のセルにすべての数字を入れても違反を突破できないときには、
1つ前の番号のセルに戻り数字を換えます。
そして、またすべての場合を試してもルール内にならないときはまた1つ前の番号に戻ります。
樹形図で書くと次のようになります。
1 ○
1→1 ×
1→2 ○
1→2→1 ×
1→2→2 ×
1→2→3 ○
1→2→3→1 ×
1→2→3→2 ×
1→2→3→3 ×
1→2→3→4 ○
1→2→3→4→1 ×
・
・
・
1→2→3→4→5→6→7→8→9 ○
でまず1行目がクリアされます。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
そして次に、2行目に1が入りますが、
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
これは同じ列に同じ数字が入ってはいけないというルールに反しますので、
次の数字2が入りますが、
今度は同じ小ブロックの中に同じ数字が入ってはいけないというルールに反してしまします。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
そこで青に3を入れますが、これも小ブロックの中に同じ数字が入ってはいけないというルールに反して
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
4 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |
64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 |
73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 |
以下これを繰り返していって
*1 | *2 | *3 | *4 | *5 | *6 | *7 | *8 | *9 |
4 | 5 | 6 | 7 | 8 | 9 | 1 | 2 | 3 |
7 | 8 | 9 | 1 | 2 | 3 | 4 | 5 | 6 |
2 | 1 | 4 | 3 | 6 | 5 | 8 | 9 | 7 |
3 | 6 | 5 | 8 | 9 | 7 | 2 | 1 | 4 |
8 | 9 | 7 | 2 | 1 | 4 | 3 | 6 | 5 |
5 | 3 | 1 | 6 | 4 | 2 | 9 | 7 | 8 |
6 | 4 | 2 | 9 | 7 | 8 | 5 | 3 | 1 |
9 | 7 | 8 | 5 | 3 | 1 | 6 | 4 | 2 |
となり1個目が完成します。
このようにしてすべての場合を調べて、
すべて答えを見つけてしまおうというわけです。
詳しくはVB入門講義応用編の第6講をご覧ください。