第16講 魔方陣汎用的生成プログラムへの挑戦
第3話 順列を2次元に並べる
解答コード例
import java.io.*;
class x{
public static int[] x=new int[100];
public static int[] y=new int[100];
public static int[][] m=new int[20][20];
public static int n,cn;
public static void main(String args[]) throws IOException {
BufferedReader a = new BufferedReader(new InputStreamReader(System.in));
System.out.println("何次魔方陣を生成させますか。");
System.out.print ("n=");
n=Integer.parseInt(a.readLine());
cn=0;
z();
f(0);
}
public static void z(){ //座標作成メソッド
int i;
for(i=0;i<n*n;i++){
x[i]=i%n;
y[i]=i/n;
}
}
public static void f(int g){ //順列を2次元に並べるメソッド
int i,j,k,h;
for(i=1;i<n*n+1;i++){
h=1;
m[y[g]][x[g]]=i;
for(j=0;j<g;j++){
if(m[y[g]][x[g]]==m[y[j]][x[j]]){
h=0;
}
}
if(h==1){
if(g+1<n*n){
f(g+1);
if(cn>20)return;
}
else{
cn++;
for(j=0;j<n;j++){
for(k=0;k<n;k++){
if(m[j][k]<10){
System.out.print(" "+m[j][k]+" ");
}
else{
System.out.print(m[j][k]+" ");
}
}
System.out.println();
}
System.out.println();
if(cn>20)return;
}
}
}
}
}
実行例
さて、これに縦・横・対角線の条件を付け加えれば、魔方陣汎用的自動生成プログラムが完成しますが・・・
初心者の方には、今話のコードは難しすぎますね。
次次話で詳しく解説をしますが、実は第10講をもう一度詳しく読み直していただければ、
理解できますよ。
第10講は、順列が1次元に並んでいたのを2次元に直しただけですから。
粘り強く
第10講 関数の再帰的呼び出し
第1話 関数の再帰的呼び出し=関数の自己再帰とは?
第2話 足し算を関数の自己再帰で行うと?
第3話 関数の再帰的呼び出しによる累乗の計算
第4話 関数の再帰的呼び出しによる汎用的順列作成プログラム
第5話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その1
第6話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その2
第7話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その3
第8話 関数の再帰的呼び出しによる汎用的順列作成プログラム解説その4
第9話 グローバル変数(メンバ変数)を使用しない汎用的順列作成プログラム
を読み返してください。そして、この難解なコードを是非氷解させましょう。
謎が解けた方は、魔方陣汎用的自動生成プログラムに挑戦しましょう。
第2話へ 第4話へ
VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門
基礎から応用まで第2部
初心者のための
VC++による C言語 入門 C++ 入門 基礎から応用まで第3部