第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;
        }
      }
    }
  }
}
実行例
java

さて、これに縦・横・対角線の条件を付け加えれば、魔方陣汎用的自動生成プログラムが完成しますが・・・
初心者の方には、今話のコードは難しすぎますね。
次次話で詳しく解説をしますが、実は第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部