第13講 3次魔方陣の自動生成 
第2話 3次魔方陣ソース
nyuumo
解答例
#include<iostream>
using namespace std;
int a[3][3],cn;
void f();
int main(){
  int i1,i2,i3,i4,i5,i6,i7,i8,i9;
  cn=0;
  for(i1=1;i1<10;i1++){
    a[0][0]=i1;
    for(i2=1;i2<10;i2++){
      a[0][1]=i2;
      if(a[0][1]!=a[0][0]){
        for(i3=1;i3<10;i3++){
          a[0][2]=i3;
          if(a[0][2]!=a[0][0] && a[0][2]!=a[0][1] ){
            if(a[0][0]+a[0][1]+a[0][2]==15){
              for(i4=1;i4<10;i4++){
                a[1][0]=i4;
                if(a[1][0]!=a[0][0] && a[1][0]!=a[0][1] && a[1][0]!=a[0][2]){
                  for(i5=1;i5<10;i5++){
                    a[1][1]=i5;
                    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(i6=1;i6<10;i6++){
                        a[1][2]=i6;
                        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]){
                          if(a[1][0]+a[1][1]+a[1][2]==15){
                            for(i7=1;i7<10;i7++){
                              a[2][0]=i7;
                              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]){
                                if(a[0][2]+a[1][1]+a[2][0]==15 && a[0][0]+a[1][0]+a[2][0]==15 ){
                                  for(i8=1;i8<10;i8++){
                                    a[2][1]=i8;
                                    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]){
                                      if(a[0][1]+a[1][1]+a[2][1]==15){
                                        for(i9=1;i9<10;i9++){
                                          a[2][2]=i9;
                                          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]){
                                            if(a[2][0]+a[2][1]+a[2][2]==15 && a[0][2]+a[1][2]+a[2][2]==15 && a[0][0]+a[1][1]+a[2][2]==15 ){
                                              f();
                                              cn++;
                                            }
                                          }
                                        }
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
  cout<<"3次魔方陣が"<<cn<<"個できました。"<<endl;
}
//関数fはコンソールへの表示専用関数
void f(){
  int i,j;
  for(i=0;i<3;i++){
    for(j=0;j<3;j++){
      cout<<a[i][j]<<" ";
    }
    cout<<endl;
  }
  cout<<endl;
}
『わけがわからん!』
とお怒りの方もいらっしゃいますよね。
大丈夫ですよ。
次話で皆さんが理解できるように丁寧に解説しますから。

解説に入る前に、1つだけ課題を出したいと思います。
#include<iostream>
using namespace std;
int a[3][3],cn;
void f();
int main(){
今回mainの前で宣言したのでグローバル変数になっていますが、
基本はなるべくグローバル変数を使わないですので、
mainの中で宣言するように変更しましょう。
cnはそもそもmainの中でしか使っていませんので、
グローバルにする意味はまったくありません。
配列の方は、配列の住所を送らなければなりませんので、
ポインタのポインタに変更する必要があります。
詳しくは、
第11講 配列・ポインタを関数に渡す
 第1話 配列を関数に渡すには?
 第2話 2次元配列を関数に渡す
 第3話 2次元配列を関数に渡すさまざまな演習その1
 第4話 2次元配列を関数に渡すさまざまな演習その2
 第5話 3次元配列を関数に渡す
 第6話 置換解答例
を参照してください。
当然、関数fも少しいじる必要があります。


第1話へ 第3話へ

戻る

C言語講義第1部へ
VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)