第9講 配列とfor文を利用して3次魔方陣を作ろう
第6話 3次順列方陣の生成プログラム


Java
(これはほんの1部です。362880通りもあるのですから。)
解答コード例
public class A{
  public static void main(String args[]){
    f();
  }
  public static void f(){
    int i,j,k,l,m,n,o,p,q;
    int[][] a=new int[3][3];
    for(i=1;i<10;i++){
      a[0][0]=i;
      for(j=1;j<10;j++){
        a[0][1]=j;
        if(a[0][1]!=a[0][0]){
          for(k=1;k<10;k++){
            a[0][2]=k;
            if(a[0][2]!=a[0][0] && a[0][2]!=a[0][1]){
              for(l=1;l<10;l++){
                a[1][0]=l;
                if(a[1][0]!=a[0][0] && a[1][0]!=a[0][1] && a[1][0]!=a[0][2]){
                  for(m=1;m<10;m++){
                    a[1][1]=m;
                    if(a[1][1]!=a[0][0] && a[1][1]!=a[0][1] && a[1][1]!=a[0][2] && a[1][1]!=a[1][0]){
                      for(n=1;n<10;n++){
                        a[1][2]=n;
                        if(a[1][2]!=a[0][0] && a[1][2]!=a[0][1] && a[1][2]!=a[0][2] && a[1][2]!=a[1][0] && a[1][2]!=a[1][1]){
                          for(o=1;o<10;o++){
                            a[2][0]=o;
                            if(a[2][0]!=a[0][0] && a[2][0]!=a[0][1] && a[2][0]!=a[0][2] && a[2][0]!=a[1][0] && a[2][0]!=a[1][1] && a[2][0]!=a[1][2]){
                              for(p=1;p<10;p++){
                                a[2][1]=p;
                                if(a[2][1]!=a[0][0] && a[2][1]!=a[0][1] && a[2][1]!=a[0][2] && a[2][1]!=a[1][0] && a[2][1]!=a[1][1] && a[2][1]!=a[1][2] && a[2][1]!=a[2][0]){
                                  for(q=1;q<10;q++){
                                    a[2][2]=q;
                                    if(a[2][2]!=a[0][0] && a[2][2]!=a[0][1] && a[2][2]!=a[0][2] && a[2][2]!=a[1][0] && a[2][2]!=a[1][1] && a[2][2]!=a[1][2] && a[2][2]!=a[2][0] && a[2][2]!=a[2][1]){
                                      System.out.print(a[0][0]);
                                      System.out.print (" ");
                                      System.out.print(a[0][1]);
                                      System.out.print (" ");
                                      System.out.print(a[0][2]);
                                      System.out.println();
                                      System.out.print(a[1][0]);
                                      System.out.print (" ");
                                      System.out.print(a[1][1]);
                                      System.out.print (" ");
                                      System.out.print(a[1][2]);
                                      System.out.println();
                                      System.out.print(a[2][0]);
                                      System.out.print (" ");
                                      System.out.print(a[2][1]);
                                      System.out.print (" ");
                                      System.out.print(a[2][2]);
                                      System.out.println();
                                      System.out.println();
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

順列方陣を作成するだけでかなりの時間を要してしまいました。
362880通りもあるからです。
これに魔方陣の条件を付け加えたら、手のつけられないほど時間がかかるですって?
大丈夫です。
条件を付け加えると0.1秒も掛からずすべてを表示していまいます。
実は、コマンドプロンプトへの表示が大変時間がかかるのです。
魔方陣の条件を満たすものは、ほとんどありませんので、かえって圧倒的に速くなるのです。
コンピュータの力恐るべしです。
ですが、まだまだこんなものではありませんよ。
学習が進んでいくと、なんと26次魔方陣でも1秒で数百の単位で作れるようになるのです。

さて、3つの条件
@ 行(横)の合計がすべて15になっている
A 列(縦)の合計がすべて15になっている
B 対角線の合計がすべ15になっている
を付け加えましょう。
さて、3次魔方陣はいったいいくつあるのでしょうか。
因みに6次魔方陣以上では、
最新のスーパーコンピュータを100年計算させてもその数がいくらかは究明することできないでしょう。
26次魔方陣クラスになると、つい最近まで世界最速であったスーパーコンピュータ京をもってしても、
宇宙時間(宇宙の始めから終わりまでの時間)計算しても解明はできないでしょう。
その数が1兆の10乗を遙かに超えることは確実です。
さて、3次魔方陣はいかに?

第5話へ 第7話へ

戻る

VB講義へ
VB講義基礎へ
vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
初心者のための Java 入門 サイト 基礎から応用まで第1部
初心者のための Java 入門 サイト 基礎から応用まで第2部
初心者のための Java 入門 サイト 基礎から応用まで第3部