第6講 If文(分岐)を理解しよう
第16話 数独のブロック部分を1次元For文によって4次元ループする方法による改良
数独のブロック部分を1次元For文によって4次元ループする方法による改良
Private Sub CommandButton1_Click()
・
・
・
v = 1
For i = 0 To 80
a = i Mod 9
s = Int(i / 9)
v = v * CLng(Cells(7 + s, 9 + a))
If a = 8 Then
If v = x Then Cells(7 + s, 18) = "○" Else Cells(16 + s, 18) = "×"
v = 1
End If
Next
Dim a3a As Byte, a3s As Byte 'a3aはaを3で割った余り。a3sはaを3で割った余り。aはiを9で割った余り。
Dim s3a As Byte, s3s As Byte 's3aはsを3で割った余り。s3sはsを3で割った余り。sはiを9で割った余り。
v = 1
For i = 0 To 80
a = i Mod 9
s = Int(i / 9)
a3a = a Mod 3
a3s = Int(a / 3)
s3a = s Mod 3
s3s = Int(s / 3)
v = v * CLng(Cells(7 + 3 * s3s + a3s, 9 + 3 * s3a + a3a))
If a = 8 Then
Cells(17 + s3s, 5 + 6 * s3a) = "第"
Cells(17 + s3s, 6 + 6 * s3a) = s + 1
Cells(17 + s3s, 7 + 6 * s3a) = "ブロック"
If v = x Then Cells(17 + s3s, 9 + 6 * s3a) = "○" Else Cells(17 + s3s, 9 + 6 * s3a) = "×"
v = 1
End If
Next
End Sub
Private Sub CommandButton2_Click()
Range("A13:F16").Select
Selection.ClearContents
Range("R7:R16,G7:G15").Select
Selection.ClearContents
Rows("16:25").Select
Selection.ClearContents
Range("A1").Select
End Sub
参考ファイル
解説
4次元ループになっていて超難解です。
なぜ4次元でしょうか。
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
(白番号は、sに対応しブロック番号を示す。ただし、0から数えている。)
まず、9ブロックが縦横と2つの方向もっていて、
2次元です。
さらに、入れ子式に入っているブロックが縦横の2次元になっています。
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
(白番号は、aに対応し、内側の正方形の番号 ただし、0から数えている。)
ですから、2次元×2次元で4次元です。
この4次元すなわち4つの方向を実現するために、
Dim a3a As Byte, a3s As Byte 'a3aはaを3で割った余り。a3sはaを3で割った余り。aはiを9で割った余り。
Dim s3a As Byte, s3s As Byte 's3aはsを3で割った余り。s3sはsを3で割った余り。sはiを9で割った余り。
a、s以外に4つの変数が用意されています。
iを9で割った余りであるsの働きが何であるか分かりますか。
0 | 1 | 2 |
3 | 4 | 5 |
6 | 7 | 8 |
sはブロック番号です。
s3aとs3sは
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
それぞれ
0 | 1 | 2 |
と
0 |
1 |
2 |
に対応しています。
そして、a3aとa3sは
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
の
0 | 1 | 2 |
と
0 |
1 |
2 |
に対応しています。
結局4つの変数s3a、s3s、a3a、a3sが
4つの方向に対応しているわけです。
s3a、s3sが外側の横と縦に対応して、
a3a、a3sが内側の横と縦に対応しているわけです。
これからトレースしていきますが、
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | |
7 | 7 | 6 | 5 | 4 | 8 | 3 | 9 | 1 | 2 |
8 | 1 | 4 | 8 | 9 | 2 | 5 | 7 | 6 | 3 |
9 | 2 | 3 | 9 | 7 | 6 | 1 | 4 | 5 | 8 |
10 | 3 | 2 | 4 | 1 | 7 | 6 | 5 | 8 | 9 |
11 | 5 | 9 | 1 | 8 | 3 | 4 | 6 | 2 | 7 |
12 | 8 | 7 | 6 | 5 | 9 | 2 | 1 | 3 | 4 |
13 | 9 | 1 | 2 | 6 | 4 | 8 | 3 | 7 | 5 |
14 | 4 | 5 | 3 | 2 | 1 | 7 | 8 | 9 | 6 |
15 | 6 | 8 | 7 | 3 | 5 | 9 | 2 | 4 | 1 |
列番号9,10,11,12,13,14,15,16,17と
行番号7,8,9,10,11,12,13,14,15の色対応に注意しながら読んでください。
かなりの分量になりますので、
何話かに分けて述べていきます。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ