第20講 魔方陣汎用的生成プログラムVer.3=末項確定法
第6話 Ver.3(末項確定法)コード解説その3
解説続きその2
前話と同じように解説していったのでは、第20講は後5話も必要になってしまいますので、
ひとつだけ選んで解説して後は、皆さんご自分でトレースをしてください。
そのひとつして
if(y[g]==n-1 && x[g]>0 && x[g]<n-1){
int
i,w=0;
for(i=0;i<n-1;i++)w+=m[i][x[g]];
int
sa;
sa=n*(n*n+1)/2-w;
if(sa<=0 ||
sa>n*n)return;
for(i=0;i<g;i++)if(sa==m[y[i]][x[i]])return;
m[y[g]][x[g]]=sa;
if(g+1<n*n){
f(g+1);
if(cn>9)return;
}
else{
cn++;
int
j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(m[i][j]<10){
System.out.print("
"+m[i][j]+" ");
}
else{
System.out.print(m[i][j]+" ");
}
}
System.out.println();
}
System.out.println();
if(cn>9)return;
}
return;
}
y | ||||||||||||
↓ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ← | x |
0 | ||||||||||||
1 | ||||||||||||
2 | ||||||||||||
3 | ||||||||||||
4 | ||||||||||||
5 | ||||||||||||
6 | ||||||||||||
7 | ||||||||||||
8 | ||||||||||||
9 |
の部分すなわち、
の部分を担当するコードの作用を見てみましょう。
色が違いは、if文
if(g+1<n*n){
f(g+1);
if(cn>9)return;
}
else{
cn++;
int
j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(m[i][j]<10){
System.out.print("
"+m[i][j]+" ");
}
else{
System.out.print(m[i][j]+" ");
}
}
System.out.println();
}
System.out.println();
if(cn>9)return;
}
の肯定部分と否定部分に対応します。
否定部分だけ解説しておきましょう。
は入れ子式人形の一番内側の人形です。
つまり、ここまで進んでときは魔方陣が完成したことを意味します。
ですので、
cn++;
int
j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(m[i][j]<10){
System.out.print("
"+m[i][j]+" ");
}
else{
System.out.print(m[i][j]+" ");
}
}
System.out.println();
}
System.out.println();
if(cn>9)return;
が果たす仕事は、魔方陣総数をカウントしてコンソールへ表示させることです。
そして、総数が10個になったら魔方陣探索をやめさせることも任務としています。
さて、以上で末項確定法すなわち魔方陣汎用的生成プログラムVer.3の解説は終了とします。
そして、これをもってJava 入門第2部も終了とさせて頂き、
次話から第3部に進みます。
第3部ではグラフィックを主テーマにして、グラフィックを利用したゲームなどに挑戦します。
また、魔方陣汎用的生成プログラムVer.4=一般種法によって、Ver.3比で1万倍から数千倍化を図り,
14次魔方陣まで生成できるようにするという講も第3部のひとつの講になります。
第5話へ 第3部第21講第1話へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第2部
初心者のための
VC++による C言語 入門 C++ 入門 基礎から応用まで第3部