第17講 関数の再帰的呼び出しによる3次・4次魔方陣の作成
第2話 仮屋崎さんの天才的方法
番号付けについて、読者の仮屋崎さんから寄せられたプログラムを紹介しましょう。
仮屋崎さんの方法なら、偶数版と奇数版に分ける必要がありません。
#pragma endregion
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
DateTime^ hj=DateTime::Now;
n=int::Parse(textBox1->Text);
s=0;
g(n);
int i,j;
array<String^>^ w=gcnew array<String^>(16);
for(i=0;i<n*n;i++){
a[y[i]][x[i]]=i;
}
for(i=0;i<n;i++){ //ここは番号付け確認ために入れてある。
for(j=0;j<n;j++){ //動作確認ができたら削る。
w[j]=(a[i][j]).ToString();
}
dataGridView1->Rows->Add(w);
}
/*
f(0);
int i;
・ とりあえず番号付けがうまくいくことを確認するため
・ /*と*/で囲み注釈文に変え動作を中止させている。
・
dataGridView1->Rows->Add(w);
*/
}
void g(char n){
char i,j;
char b[10][10];
int cn=n;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
b[i][j]=-1;
}
}
for(i=0;i<n;i++){
b[i][i]=i;
}
for(i=0;i<n;i++){
if(b[i][n-1-i]==-1){
b[i][n-1-i]=cn;
cn++;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(b[i][j]==-1){
b[i][j]=cn;
cn++;
}
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
x[b[i][j]]=j;
y[b[i][j]]=i;
}
}
}
・
・
・
これで実際に動くことを確認されて下さい。
仮屋崎さんの方法が天才的なのは、
旧講義の方法が
番号から各座標へ
の直線的方法だったのが、
@各座標から番号へ
A番号から各座標へ
と複線的に考えていることです。
これはコペルニクス的転回です。
最終目標が「番号から各座標へ」であったのに対して、
それを転回させて「各座標から番号へ」を考えてから、
再び逆にしてます。
このことによって非常に複雑な番号付けを簡単に解決してしまっているのです。
この説明を聞いても、初心者の方には?が浮かんでいるだけだと思いますので、
次話以降で詳しく解説していきましょう。
私は垂直思考しかしていなかったの対して、仮屋崎さんは水平思考で見事に解決しています。
プログラミングとは本当におもしろいものです。
やはり、創造的なプログラミングをするためには水平思考=右脳による思考が必要ですね。
第17講(再講義)第1話へ 第17講(再講義)第3話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual
Basic入門基礎講座