第28講 細胞構成法による魔方陣の作成△

第7話 素数次魔方陣の作成
すべての細胞の作成に成功したので、次の課題に挑戦していただきます。
方針は、奇数次魔方陣を作り、細胞の利用によって偶数化することです。

実は、奇数次魔方陣については簡単な方法が知られています。
特に、5以上の素数次魔方陣については非常に簡単な方法があります。
例えば、5次を例にして作り方を説明しましょう。

まず、任意の順列

(任意ですから、上は1例です。)
を作ります。
そして、2ずらしを行います。

1 2 3 4 5
4 5 1 2 3
2 3 4 5 1
5 1 2 3 4
3 4 5 1 2

他方、3ずらしを行います。

1 2 3 4 5
3 4 5 1 2
5 1 2 3 4
2 3 4 5 1
4 5 1 2 3

上の方陣の数字からは、1引いて5倍しそれに下の方陣の数字を加えます。

1 7 13 19 25
18 24 5 6 12
10 11 17 23 4
22 3 9 15 16
14 20 21 2 8

(例えば、15=(-1)×5+です。)



3次については、末項確定法をそのまま採用し、
5次と7次についてはこのずらし方を採用します。
(理論的には、21×2=42次あたりでも可能ですが、
今回は、3×2,5×2、7×3の3通りにします。
後で、26次まで作れるように変更しますが。
素数以外の奇数(例えば、9)などについては上の方法を若干変更しなければならないからです。)

今回の課題は、
初心者

私は、

1 2 3 4 5
4 5 1 2 3
2 3 4 5 1
5 1 2 3 4
3 4 5 1 2

のように縦・横・対角線の合計が一致する方陣を魔方陣の種と名付けていますが
(詳しくは、小学生・中学生のための魔方陣授業第3回 魔方陣の一般的作成方法旧魔方陣HP2.一般的理論
などを参照してください。)、
それぞれの種について

を任意の順列にして、種を組み合わせて魔方陣を作成する関数を作ってください。

作成を途中で止めなければ、5次魔方陣なら5!×5!=120×120で14400通り出来ます。

ヒントは、細胞作成のコードを参考にしてください。

尚、コードの
#pragma endregion
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
                   ・
                   ・
          if(h==1){
                   ・
                   ・
            cn=0;
            zhy(); //細胞作成用座標の作成
            sbs(0); //細胞の作成
            
int i,j,k;
            //作成した細胞の表示
            for(i=0;i<cn*3+1;i++)dataGridView1->Rows->Add();
            for(i=0;i<cn;i++){
              for(j=0;j<2;j++){
                for(k=0;k<2;k++){
                  dataGridView1[k,j+3*i]->Value =sbr[i][j][k]; //このdataGridView1の使い方については次話で解説
                }
              }
            }
            dataGridView1[0,cn*3]->Value =cn; //細胞総数の表示

                   ・

紺色の部分は削るか/*と*/で囲って注釈文にするかにしてください。

第6話へ
第8話へ

戻る

VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座