第7講 For文を入れ子式に使い多次元ループを実現する
第7話 順列作成マクロ解説その1

順列作成マクロプログラム重要部分再掲
Private Sub CommandButton1_Click()
  Dim i As Byte, j As Byte, k As Byte, cn As Byte
  cn = 0
 
For i = 1 To 3
    
For j = 1 To 3
      If i <> j Then
        
For k = 1 To 3
          If k <> i And k <> j Then
            Cells(5, 2 + cn * 4) = i
            Cells(5, 3 + cn * 4) = j
            Cells(5, 4 + cn * 4) = k
            cn = cn + 1
          End If
        
Next
      End If
    
Next
 
Next
End Sub

順列1
ikの役割が分かるようにコードと実行画面を色対応してあります。
iは順列の1番最初のセルを担当し、
は順列の2番目のセルを担当し、
kは順列の3番目のセルを担当しているわけです。
さて、
      If i <> j Then

                  ・・・
      End If
は何のためにあるのでしょうか。
順列の規則は同じ数字の重複を認めないということでした。
ですから、111ようなものは順列として認めません。
      If i <> j Then

                  ・・・
      End If
の役割は1番目のセルと2番目のセルの数字順列部分
が重ならないようにしているのです。

          If k <> i And k <> j Then
            ・・・
          End If
の役割をもうお分かりですね。
これは3番目のセルの数字が、
1番目のセルの数字とも、
2番目のセルの数字とも重ならないようにしているのです。
順列2

残りは、

            Cells(5, 2 + cn * 4) = i
            Cells(5, 3 + cn * 4) = j
            Cells(5, 4 + cn * 4) = k
            cn = cn + 1
の4行を理解することです。
cnはカウンターすなわち数える変数です。
今何個目の順列を作っているか数えています。
ただし、cnは0から始まっていますので、
最初の順列を0個目、2個目の順列を1個目などと数えています。
もし、最初の順列を1個目、次の順列を2個目と数えさせたいなら、
コードは次のように変更しなければなりません。
            cn = cn + 1
            Cells(5, - 2 + cn * 4) = i
            Cells(5, - 1 + cn * 4) = j
            Cells(5, cn * 4) = k
Cells(5, - 2 + cn * 4) = iなどに?が浮かびますよね。
一番最初のループにおいてcn = cn + 1からcnは1になっています。
すると、Cells(5, - 2 + cn * 4) はCells(5, - 2 + 1 * 4)すなわちCells(5, 2)となり、
順列3B5のセルになります。
もし、Cells(5, 2 + cn * 4) のままだと
Cells(5, 2 + 1 * 4) = Cells(5, 6)になってしまい、
図F5の位置に最初の順列が表示されてしまうことになります。
ですから、 Cells(5, - 2 + cn
* 4) に変更しなければならないのです。
さて、
* 4の意味は何でしょうか。
それは4つ飛びにするという意味です。
B5の次はF5ですね。
BCDEFですから、間が4つですよね。
4つ飛びにするときに+ cn * 4とすることが有用な手法です。
魔方陣と数独を主な題材とする本講義ではしばしば登場する手法です。
是非とも覚えてください。

では皆さん、
方陣順列
を実行する課題に挑戦してください。
この課題は、魔方陣や数独に直結する課題です。
魔方陣の方は別にして、
数独の方はどうして直接繋がっているのかお分かりですよね。
そうです。
今回は1から4ですが、それを1から9までにすれば
数独の1つのブロックですね。
尚、

1 2
3 4

のすべての場合
方陣順列を4次方陣順列と名付けます。
つまり、1から4の順列を方陣上に並べたものを4次方陣順列と定義するのです。
この名称を使うなら、
数独の1ブロックは9次方陣順列の1つということになります。

尚、4次方陣順列は細胞構成法という手法で、
偶数次の魔方陣(例えば、6次魔方陣や22次魔方陣)を作成するときの
必須のアイテムになります。
私の開発した最速の魔方陣作成プログラムは、
26次魔方陣を1秒あたり数十の勢いで生成していきますが、
そこで使っている手法が細胞構成法です。





6話へ 第8話へ


トップ

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

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