第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はブロック番号です。
s3as3s

   0
0 0 1 2
1 3 4 5
2 6 7 8

それぞれ

 0


0
1
2

に対応しています。
そして、a3a
a3s

 
0 1 2
3 4 5
6 7 8

に対応しています。
結局4つの変数s3as3sa3aa3s
4つの方向に対応しているわけです。
s3as3sが外側の横と縦に対応して、
a3aa3sが内側の横と縦に対応しているわけです。

これからトレースしていきますが、

  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の色対応に注意しながら読んでください。
かなりの分量になりますので、
何話かに分けて述べていきます。





15話へ 第17話へ


トップ

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

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