第28講 細胞構成法による魔方陣の作成△
第7話 素数次魔方陣の作成
すべての細胞の作成に成功したので、次の課題に挑戦していただきます。
方針は、奇数次魔方陣を作り、細胞の利用によって偶数化することです。
実は、奇数次魔方陣については簡単な方法が知られています。
特に、5以上の素数次魔方陣については非常に簡単な方法があります。
例えば、5次を例にして作り方を説明しましょう。
まず、任意の順列
1 | 2 | 3 | 4 | 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=(3-1)×5+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回 魔方陣の一般的作成方法や旧魔方陣HPの2.一般的理論
などを参照してください。)、
それぞれの種について
1 | 2 | 3 | 4 | 5 |
を任意の順列にして、種を組み合わせて魔方陣を作成する関数を作ってください。
作成を途中で止めなければ、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入門基礎講座